diff --git a/lombok.config b/lombok.config index 753b316b5..a3a1dc642 100644 --- a/lombok.config +++ b/lombok.config @@ -1,2 +1,2 @@ lombok.log.fieldName = LOGGER - +lombok.addLombokGeneratedAnnotation = true diff --git a/prototype/README.md b/prototype/README.md index d4f3ef4ef..855d4d073 100644 --- a/prototype/README.md +++ b/prototype/README.md @@ -22,7 +22,7 @@ used for creating new objects from prototype instances. Real-world example -> Remember Dolly? The sheep that was cloned! Lets not get into the details but the key point here is +> Remember Dolly? The sheep that was cloned! Let's not get into the details but the key point here is > that it is all about cloning. In plain words @@ -45,8 +45,11 @@ interface with a method for cloning objects. In this example, `Prototype` interf this with its `copy` method. ```java -public interface Prototype { - Object copy(); +public abstract class Prototype implements Cloneable { + @SneakyThrows + public T copy() { + return (T) super.clone(); + } } ``` @@ -54,15 +57,13 @@ Our example contains a hierarchy of different creatures. For example, let's look `OrcBeast` classes. ```java -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = false) @NoArgsConstructor -public abstract class Beast implements Prototype { +public abstract class Beast extends Prototype { public Beast(Beast source) { } - @Override - public abstract Beast copy(); } @EqualsAndHashCode(callSuper = false) @@ -76,19 +77,15 @@ public class OrcBeast extends Beast { this.weapon = orcBeast.weapon; } - @Override - public OrcBeast copy() { - return new OrcBeast(this); - } - @Override public String toString() { return "Orcish wolf attacks with " + weapon; } + } ``` -We don't want to go into too much details, but the full example contains also base classes `Mage` +We don't want to go into too many details, but the full example contains also base classes `Mage` and `Warlord` and there are specialized implementations for those for elves in addition to orcs. To take full advantage of the prototype pattern, we create `HeroFactory` and `HeroFactoryImpl` diff --git a/prototype/src/main/java/com/iluwatar/prototype/Beast.java b/prototype/src/main/java/com/iluwatar/prototype/Beast.java index ecae07063..9a0a9e088 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/Beast.java +++ b/prototype/src/main/java/com/iluwatar/prototype/Beast.java @@ -29,14 +29,11 @@ import lombok.NoArgsConstructor; /** * Beast. */ -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = false) @NoArgsConstructor -public abstract class Beast implements Prototype { +public abstract class Beast extends Prototype { public Beast(Beast source) { } - @Override - public abstract Beast copy(); - } diff --git a/prototype/src/main/java/com/iluwatar/prototype/ElfBeast.java b/prototype/src/main/java/com/iluwatar/prototype/ElfBeast.java index 830bad95c..8231453a5 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/ElfBeast.java +++ b/prototype/src/main/java/com/iluwatar/prototype/ElfBeast.java @@ -40,11 +40,6 @@ public class ElfBeast extends Beast { this.helpType = elfBeast.helpType; } - @Override - public ElfBeast copy() { - return new ElfBeast(this); - } - @Override public String toString() { return "Elven eagle helps in " + helpType; diff --git a/prototype/src/main/java/com/iluwatar/prototype/ElfMage.java b/prototype/src/main/java/com/iluwatar/prototype/ElfMage.java index 7f5183349..eb25f6c44 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/ElfMage.java +++ b/prototype/src/main/java/com/iluwatar/prototype/ElfMage.java @@ -40,11 +40,6 @@ public class ElfMage extends Mage { this.helpType = elfMage.helpType; } - @Override - public ElfMage copy() { - return new ElfMage(this); - } - @Override public String toString() { return "Elven mage helps in " + helpType; diff --git a/prototype/src/main/java/com/iluwatar/prototype/ElfWarlord.java b/prototype/src/main/java/com/iluwatar/prototype/ElfWarlord.java index b45ae693e..fba36eb1d 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/ElfWarlord.java +++ b/prototype/src/main/java/com/iluwatar/prototype/ElfWarlord.java @@ -24,31 +24,24 @@ package com.iluwatar.prototype; import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; /** * ElfWarlord. */ -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = true) +@RequiredArgsConstructor public class ElfWarlord extends Warlord { private final String helpType; - public ElfWarlord(String helpType) { - this.helpType = helpType; - } - public ElfWarlord(ElfWarlord elfWarlord) { super(elfWarlord); this.helpType = elfWarlord.helpType; } - @Override - public ElfWarlord copy() { - return new ElfWarlord(this); - } - @Override public String toString() { return "Elven warlord helps in " + helpType; } -} \ No newline at end of file +} diff --git a/prototype/src/main/java/com/iluwatar/prototype/Mage.java b/prototype/src/main/java/com/iluwatar/prototype/Mage.java index a1a847358..2398fba70 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/Mage.java +++ b/prototype/src/main/java/com/iluwatar/prototype/Mage.java @@ -29,14 +29,11 @@ import lombok.NoArgsConstructor; /** * Mage. */ -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = false) @NoArgsConstructor -public abstract class Mage implements Prototype { +public abstract class Mage extends Prototype { public Mage(Mage source) { } - @Override - public abstract Mage copy(); - } diff --git a/prototype/src/main/java/com/iluwatar/prototype/OrcBeast.java b/prototype/src/main/java/com/iluwatar/prototype/OrcBeast.java index 4c8936356..dfef256fc 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/OrcBeast.java +++ b/prototype/src/main/java/com/iluwatar/prototype/OrcBeast.java @@ -40,11 +40,6 @@ public class OrcBeast extends Beast { this.weapon = orcBeast.weapon; } - @Override - public OrcBeast copy() { - return new OrcBeast(this); - } - @Override public String toString() { return "Orcish wolf attacks with " + weapon; diff --git a/prototype/src/main/java/com/iluwatar/prototype/OrcMage.java b/prototype/src/main/java/com/iluwatar/prototype/OrcMage.java index a7361ec80..016ada895 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/OrcMage.java +++ b/prototype/src/main/java/com/iluwatar/prototype/OrcMage.java @@ -40,11 +40,6 @@ public class OrcMage extends Mage { this.weapon = orcMage.weapon; } - @Override - public OrcMage copy() { - return new OrcMage(this); - } - @Override public String toString() { return "Orcish mage attacks with " + weapon; diff --git a/prototype/src/main/java/com/iluwatar/prototype/OrcWarlord.java b/prototype/src/main/java/com/iluwatar/prototype/OrcWarlord.java index 1096cc979..5e7873ee5 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/OrcWarlord.java +++ b/prototype/src/main/java/com/iluwatar/prototype/OrcWarlord.java @@ -40,11 +40,6 @@ public class OrcWarlord extends Warlord { this.weapon = orcWarlord.weapon; } - @Override - public OrcWarlord copy() { - return new OrcWarlord(this); - } - @Override public String toString() { return "Orcish warlord attacks with " + weapon; diff --git a/prototype/src/main/java/com/iluwatar/prototype/Prototype.java b/prototype/src/main/java/com/iluwatar/prototype/Prototype.java index 2581b5215..7c2345fa5 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/Prototype.java +++ b/prototype/src/main/java/com/iluwatar/prototype/Prototype.java @@ -23,11 +23,21 @@ package com.iluwatar.prototype; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + /** * Prototype. */ -public interface Prototype { - - Object copy(); +@Slf4j +public abstract class Prototype implements Cloneable { + /** + * Object a shallow copy of this object or null if this object is not Cloneable. + */ + @SuppressWarnings("unchecked") + @SneakyThrows + public T copy() { + return (T) super.clone(); + } } diff --git a/prototype/src/main/java/com/iluwatar/prototype/Warlord.java b/prototype/src/main/java/com/iluwatar/prototype/Warlord.java index 7176ccf0c..b3b03143a 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/Warlord.java +++ b/prototype/src/main/java/com/iluwatar/prototype/Warlord.java @@ -29,14 +29,11 @@ import lombok.NoArgsConstructor; /** * Warlord. */ -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = false) @NoArgsConstructor -public abstract class Warlord implements Prototype { +public abstract class Warlord extends Prototype { public Warlord(Warlord source) { } - @Override - public abstract Warlord copy(); - } diff --git a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java index b22f7ba8e..b968532b7 100644 --- a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java +++ b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java @@ -39,7 +39,7 @@ import org.junit.jupiter.params.provider.MethodSource; * @param

Prototype * @author Jeroen Meulemeester */ -class PrototypeTest

{ +class PrototypeTest

> { static Collection dataProvider() { return List.of( new Object[]{new OrcBeast("axe"), "Orcish wolf attacks with axe"},