BAEL-5915 Added different ways to create an object (#13539)

This commit is contained in:
Shaun Phillips 2023-02-25 17:45:16 +00:00 committed by GitHub
parent 8a02df3f58
commit 8fd4ad46ea
6 changed files with 234 additions and 0 deletions

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,7 @@
package com.baeldung.objectcreation.objects;
public enum RabbitType {
PET,
TAME,
WILD
}

View File

@ -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;
}
}

View File

@ -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<Rabbit> 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.
}
}

View File

@ -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);
}
}