diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java new file mode 100644 index 0000000000..0d97e010fb --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java @@ -0,0 +1,18 @@ +package com.baeldung.objectcreation.objects; + +public class ClonableRabbit implements Cloneable { + + String name = ""; + + public ClonableRabbit(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java new file mode 100644 index 0000000000..c8a8159544 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java @@ -0,0 +1,17 @@ +package com.baeldung.objectcreation.objects; + +public class Rabbit { + + String name = ""; + + public Rabbit() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java new file mode 100644 index 0000000000..b7afe5fe2f --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java @@ -0,0 +1,7 @@ +package com.baeldung.objectcreation.objects; + +public enum RabbitType { + PET, + TAME, + WILD +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java new file mode 100644 index 0000000000..cb5f2d0b71 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java @@ -0,0 +1,21 @@ +package com.baeldung.objectcreation.objects; + +import java.io.Serializable; + +public class SerializableRabbit implements Serializable { + + private static final long serialVersionUID = 2589844379773087465L; + + String name = ""; + + public SerializableRabbit() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java new file mode 100644 index 0000000000..8b3c84e89c --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java @@ -0,0 +1,71 @@ +package com.baeldung.objectcreation.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.lang.reflect.InvocationTargetException; +import java.util.function.Supplier; + +import com.baeldung.objectcreation.objects.ClonableRabbit; +import com.baeldung.objectcreation.objects.Rabbit; +import com.baeldung.objectcreation.objects.RabbitType; +import com.baeldung.objectcreation.objects.SerializableRabbit; + +public final class CreateRabbits { + + public static Rabbit createRabbitUsingNewOperator() { + Rabbit rabbit = new Rabbit(); + + return rabbit; + } + + public static Rabbit createRabbitUsingClassForName() throws InstantiationException, IllegalAccessException, ClassNotFoundException { + Rabbit rabbit = (Rabbit) Class.forName("com.baeldung.objectcreation.objects.Rabbit").newInstance(); + + return rabbit; + } + + public static Rabbit createRabbitUsingClassNewInstance() throws InstantiationException, IllegalAccessException { + Rabbit rabbit = Rabbit.class.newInstance(); + + return rabbit; + } + + public static Rabbit createRabbitUsingConstructorNewInstance() throws InstantiationException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException, NoSuchMethodException, SecurityException { + Rabbit rabbit = Rabbit.class.getConstructor().newInstance(); + + return rabbit; + } + + public static ClonableRabbit createRabbitUsingClone(ClonableRabbit originalRabbit) throws CloneNotSupportedException { + ClonableRabbit clonedRabbit = (ClonableRabbit) originalRabbit.clone(); + + return clonedRabbit; + } + + public static SerializableRabbit createRabbitUsingDeserialization(File file) throws IOException, ClassNotFoundException { + try (FileInputStream fis = new FileInputStream(file); + ObjectInputStream ois = new ObjectInputStream(fis);) { + return (SerializableRabbit) ois.readObject(); + } + } + + public static Rabbit createRabbitUsingSupplier() { + Supplier rabbitSupplier = Rabbit::new; + Rabbit rabbit = rabbitSupplier.get(); + + return rabbit; + } + + public static Rabbit[] createRabbitArray() { + Rabbit[] rabbitArray = new Rabbit[10]; + + return rabbitArray; + } + + public static RabbitType createRabbitTypeEnum() { + return RabbitType.PET; //any RabbitType could be returned here, PET is just an example. + } +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java new file mode 100644 index 0000000000..653beba096 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java @@ -0,0 +1,100 @@ +package com.baeldung.objectcreation; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.lang.reflect.InvocationTargetException; + +import org.junit.Test; + +import com.baeldung.objectcreation.objects.ClonableRabbit; +import com.baeldung.objectcreation.objects.Rabbit; +import com.baeldung.objectcreation.objects.RabbitType; +import com.baeldung.objectcreation.objects.SerializableRabbit; +import com.baeldung.objectcreation.utils.CreateRabbits; + +public class CreateRabbitsUnitTest { + + @Test + public void whenUsingNewOperator_thenRabbitIsReturned() { + assertTrue(CreateRabbits.createRabbitUsingNewOperator() instanceof Rabbit); + } + + @Test + public void whenUsingClassForName_thenRabbitIsReturned() throws InstantiationException, IllegalAccessException, ClassNotFoundException { + assertTrue(CreateRabbits.createRabbitUsingClassForName() instanceof Rabbit); + } + + @Test + public void whenUsingClassNewInstance_thenRabbitIsReturned() throws InstantiationException, IllegalAccessException { + assertTrue(CreateRabbits.createRabbitUsingClassNewInstance() instanceof Rabbit); + } + + @Test + public void whenUsingConstructorNewInstance_thenRabbitIsReturned() throws InstantiationException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException, NoSuchMethodException, SecurityException { + assertTrue(CreateRabbits.createRabbitUsingConstructorNewInstance() instanceof Rabbit); + } + + @Test + public void givenClonableRabbit_whenUsingCloneMethod_thenClonedRabbitIsReturned() throws CloneNotSupportedException { + //given + ClonableRabbit originalRabbit = new ClonableRabbit("Peter"); + + //when + ClonableRabbit clonedRabbit = CreateRabbits.createRabbitUsingClone(originalRabbit); + + //then + assertTrue(clonedRabbit instanceof ClonableRabbit); + assertNotEquals(originalRabbit, clonedRabbit); + assertEquals("Peter", clonedRabbit.getName()); + } + + @Test + public void givenSerializedRabbit_whenDeserializing_thenNewRabbitIsReturned() throws IOException, ClassNotFoundException { + //given + SerializableRabbit originalRabbit = new SerializableRabbit(); + originalRabbit.setName("Peter"); + + File resourcesFolder = new File("src/test/resources"); + resourcesFolder.mkdirs(); //creates the directory in case it doesn't exist + + File file = new File(resourcesFolder, "rabbit.ser"); + + try (FileOutputStream fileOutputStream = new FileOutputStream(file); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);) { + objectOutputStream.writeObject(originalRabbit); + } + + //when + SerializableRabbit newRabbit = CreateRabbits.createRabbitUsingDeserialization(file); + + //then + assertTrue(newRabbit instanceof SerializableRabbit); + assertNotEquals(originalRabbit, newRabbit); + assertEquals("Peter", newRabbit.getName()); + + //clean up + file.delete(); + } + + @Test + public void whenUsingSupplier_thenRabbitIsReturned() { + assertTrue(CreateRabbits.createRabbitUsingSupplier() instanceof Rabbit); + } + + @Test + public void whenUsingArrays_thenRabbitArrayIsReturned() { + assertTrue(CreateRabbits.createRabbitArray() instanceof Rabbit[]); + } + + @Test + public void whenUsingEnums_thenRabbitTypeIsReturned() { + assertTrue(CreateRabbits.createRabbitTypeEnum() instanceof RabbitType); + } +}