diff --git a/src/Annotations/ValidLength.java b/src/Annotations/ValidLength.java new file mode 100644 index 0000000..41d0efa --- /dev/null +++ b/src/Annotations/ValidLength.java @@ -0,0 +1,11 @@ +package Annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ValidLength { +} \ No newline at end of file diff --git a/src/Characters/Character.java b/src/Characters/Character.java index 6ebba26..218fde1 100644 --- a/src/Characters/Character.java +++ b/src/Characters/Character.java @@ -1,5 +1,6 @@ package Characters; +import Annotations.ValidLength; import Entity.Entity; import Items.Item; @@ -25,6 +26,8 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I private final Gender gender; private Entity position; + + @ValidLength private String currentState = ""; protected Feels feel; protected Item itemInHand; @@ -62,6 +65,7 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I protected final void setPosition(Entity obj) { this.position = obj; + this.validateFields(); } public final String getState() { @@ -70,6 +74,7 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I protected final void setState(String state) { this.currentState = state; + this.validateFields(); } @Override @@ -89,4 +94,34 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I public int hashCode() { return Objects.hash(this.name, this.gender); } + + private void validateFields() { + for (java.lang.reflect.Field field : Character.class.getDeclaredFields()) { + if (field.isAnnotationPresent(ValidLength.class)) { + String value = getValueForField(this, field); + if (value.length() < 3 || value.length() > 20) { + setValueForField(this, field, "unknown"); + } + } + } + } + + private static String getValueForField(Object obj, java.lang.reflect.Field field) { + try { + field.setAccessible(true); + return (String) field.get(obj); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + private static void setValueForField(Object obj, java.lang.reflect.Field field, String value) { + try { + field.setAccessible(true); + field.set(obj, value); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } } diff --git a/src/Characters/Karlson.java b/src/Characters/Karlson.java index f473b6f..25556f6 100644 --- a/src/Characters/Karlson.java +++ b/src/Characters/Karlson.java @@ -90,12 +90,7 @@ public class Karlson extends Character implements IGrabbable, IFlyable { }) }; - int minPath = Integer.MAX_VALUE; - for (Path path: paths) { - minPath = Math.min(path.getResult(), minPath); - } - - return minPath; + return Arrays.stream(paths).map(Path::getResult).min(Integer::compare).get(); } } diff --git a/src/Characters/Malysh.java b/src/Characters/Malysh.java index 526e26f..fccdae6 100644 --- a/src/Characters/Malysh.java +++ b/src/Characters/Malysh.java @@ -4,20 +4,32 @@ import Entity.Entity; import Items.Item; public class Malysh extends Character { - public Mouth mouth = new Mouth(); + private final Mouth mouth = new Mouth(32); public Malysh() { - super("Малыш", Gender.MAN ,Feels.NORMAL); + super("Малыш", Gender.MAN, Feels.NORMAL); } - public class Mouth { + private class Mouth { + private final int numsOfTeeth; + Mouth(int numsOfTeeth) { + this.numsOfTeeth = numsOfTeeth; + } public void speak(String speech) { if (speech == null) { Malysh.this.setState(String.format("%s ничего не сказал", Malysh.this.getGender())); return; } + if (numsOfTeeth < 8) { + Malysh.this.setState(String.format("%s что-то пробормотал", Malysh.this.getGender())); + return; + } Malysh.this.setState(String.format("%s сказал: \"%s\"", Malysh.this.getName(), speech)); } } + public void speak(String speach) { + this.mouth.speak(speach); + } + @Override public void moveTo(Entity obj) { this.setPosition(obj); diff --git a/src/StoryTeller/StoryTeller.java b/src/StoryTeller/StoryTeller.java index 188dd45..a3cbe91 100644 --- a/src/StoryTeller/StoryTeller.java +++ b/src/StoryTeller/StoryTeller.java @@ -43,7 +43,7 @@ public class StoryTeller { System.out.println(frenBok.getState()); malysh.setFeel(Feels.DEAD_INSIDE); System.out.println(malysh.getState()); - malysh.mouth.speak(null); + malysh.speak(null); System.out.println(malysh.getState()); door.closeDoor(); karlson.moveTo(door);