#10 effective java: item 3

This commit is contained in:
haerong22
2022-05-13 01:32:43 +09:00
parent e94dea9b6d
commit eb96046e52
12 changed files with 231 additions and 0 deletions

BIN
effective-java/elvis.obj Normal file

Binary file not shown.

View File

@@ -0,0 +1,28 @@
package com.example.effectivejava.chapter01.item03.field;
public class Concert {
private boolean lightsOn;
private boolean mainStateOpen;
private IElvis elvis;
public Concert(IElvis elvis) {
this.elvis = elvis;
}
public void perform() {
mainStateOpen = true;
lightsOn = true;
elvis.sing();
}
public boolean isLightsOn() {
return lightsOn;
}
public boolean isMainStateOpen() {
return mainStateOpen;
}
}

View File

@@ -0,0 +1,42 @@
package com.example.effectivejava.chapter01.item03.field;
import java.io.Serial;
import java.io.Serializable;
// 코드 3-1 public static final 필드 방식의 싱글턴 (23쪽)
public class Elvis implements IElvis, Serializable {
/**
* 싱글톤 오브젝트
*/
public static final Elvis INSTANCE = new Elvis();
private static boolean created;
private Elvis() {
if (created) {
throw new UnsupportedOperationException("can't be created by constructor.");
}
created = true;
}
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
public void sing() {
System.out.println("I'll have a blue~ Christmas without you~");
}
// 이 메서드는 보통 클래스 바깥(다른 클래스)에 작성해야 한다!
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
@Serial
private Object readResolve() {
return INSTANCE;
}
}

View File

@@ -0,0 +1,22 @@
package com.example.effectivejava.chapter01.item03.field;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
// 생성자로 여러 인스턴스 만들기
public class ElvisReflection {
public static void main(String[] args) {
try {
Constructor<Elvis> defaultConstructor = Elvis.class.getDeclaredConstructor();
defaultConstructor.setAccessible(true);
Elvis elvis1 = defaultConstructor.newInstance();
Elvis elvis2 = defaultConstructor.newInstance();
Elvis.INSTANCE.sing();
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,23 @@
package com.example.effectivejava.chapter01.item03.field;
import java.io.*;
// 역직렬화로 여러 인스턴스 만들기
public class ElvisSerialization {
public static void main(String[] args) {
try (ObjectOutput out = new ObjectOutputStream(new FileOutputStream("elvis.obj"))) {
out.writeObject(Elvis.INSTANCE);
} catch (IOException e) {
e.printStackTrace();
}
try (ObjectInput in = new ObjectInputStream(new FileInputStream("elvis.obj"))) {
Elvis elvis3 = (Elvis) in.readObject();
System.out.println(elvis3 == Elvis.INSTANCE);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,8 @@
package com.example.effectivejava.chapter01.item03.field;
public interface IElvis {
void leaveTheBuilding();
void sing();
}

View File

@@ -0,0 +1,16 @@
package com.example.effectivejava.chapter01.item03.staticfactory;
import java.util.function.Supplier;
public class Concert {
public void start(Supplier<Singer> singerSupplier) {
Singer singer = singerSupplier.get();
singer.sing();
}
public static void main(String[] args) {
Concert concert = new Concert();
concert.start(Elvis::getInstance);
}
}

View File

@@ -0,0 +1,26 @@
package com.example.effectivejava.chapter01.item03.staticfactory;
// 코드 3-2 정적 팩터리 방식의 싱글턴 (24쪽)
public class Elvis implements Singer {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
// 이 메서드는 보통 클래스 바깥(다른 클래스)에 작성해야 한다!
public static void main(String[] args) {
Elvis elvis = Elvis.getInstance();
elvis.leaveTheBuilding();
System.out.println(Elvis.getInstance());
System.out.println(Elvis.getInstance());
}
@Override
public void sing() {
System.out.println("my way~~~");
}
}

View File

@@ -0,0 +1,30 @@
package com.example.effectivejava.chapter01.item03.staticfactory;
// 코드 3-2 제네릭 싱글톤 팩토리 (24쪽)
public class MetaElvis<T> {
private static final MetaElvis<Object> INSTANCE = new MetaElvis<>();
private MetaElvis() { }
@SuppressWarnings("unchecked")
public static <E> MetaElvis<E> getInstance() { return (MetaElvis<E>) INSTANCE; }
public void say(T t) {
System.out.println(t);
}
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
public static void main(String[] args) {
MetaElvis<String> elvis1 = MetaElvis.getInstance();
MetaElvis<Integer> elvis2 = MetaElvis.getInstance();
System.out.println(elvis1);
System.out.println(elvis2);
elvis1.say("hello");
elvis2.say(100);
}
}

View File

@@ -0,0 +1,6 @@
package com.example.effectivejava.chapter01.item03.staticfactory;
public interface Singer {
void sing();
}

View File

@@ -0,0 +1,17 @@
package com.example.effectivejava.chapter01.item03.field;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ConcertTest {
@Test
void perform() {
Concert concert = new Concert(new MockElvis());
concert.perform();
assertTrue(concert.isLightsOn());
assertTrue(concert.isMainStateOpen());
}
}

View File

@@ -0,0 +1,13 @@
package com.example.effectivejava.chapter01.item03.field;
public class MockElvis implements IElvis {
@Override
public void leaveTheBuilding() {
}
@Override
public void sing() {
System.out.println("You ain't nothin' but a hound dog.");
}
}