ν΄λΉ μ₯μμλ μ±κΈν΄μ λ§λλ λ°©μμ μκ°νκ³ μλ€. private μμ±μλ₯Ό μ΄μ©νλ 2κ°μ§ λ°©μκ³Ό μ΄κ±° νμ μ μ΄μ©νλ 1κ°μ§ λ°©μ, μ΄ 3κ°μ§ λ°©μμ μκ°νκ³ μλ€. κ°κ°μ μ₯μ κ³Ό λ¨μ μ λν΄μ μμ보μ.
1. 'private μμ±μ + public static final νλ'λ₯Ό μ΄μ©νλ λ°©λ²
public class Elvis{
/**
* μ±κΈν€ μ€λΈμ νΈ
*/
public static final Elvis INSTANCE = new Elvis();
private Elvis(){}
public void leaveTheBuilding(){
System.out.println("Whoa baby, I'm outta here!");
}
public void sing(){
System.out.println("I'll hava a blue~ Christmas without you~");
}
}
------------------------------
// μλλ λ€λ₯Έ ν΄λμ€μ μμ±λ κ²μ΄λΌκ³ μκ°νμ.
public static void main(String[] args){
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
μμ κ°μ΄ λ§λ€κ³ μ¬μ©ν μ μλ€. μ΄κ²μ 'κ°κ²°νκ³ μ±κΈν΄μμ APIμ λ€μ΄λΌ μ μλ€.'λΌλ μ₯μ μ΄ μλ€. μμ±μκ° privateμΈ κ²μ λ³΄κ³ μΈμ€ν΄μ€λ₯Ό μ§μ μμ±νμ§ λͺ»νκ² λ§μλ€λ κ²μ λ°λ‘ μ μ μλ€. κ·Έλ¦¬κ³ static finalλ‘ μ μΈλ λΆλΆμ΄ μλ°λ μμ± μ λ³λμ νλλ‘ λ³΄μ¬μ£ΌκΈ° λλ¬Έμ μ£Όμκ³Ό ν¨κ» μ±κΈν΄μμ APIμ λλ¬λΌ μ μλ€λ κ²μ΄λ€. (μλ°λ μμ descriptionμ μ£Όμμ΄ λ€μ΄κ°)
첫 λ²μ§Έ λ¨μ μ μ±κΈν€μ μ¬μ©νλ ν΄λΌμ΄μΈνΈκ° ν μ€νΈλ₯Ό νκΈ° μ΄λ ΅λ€λ κ²μ΄λ€. μλμ κ°μ΄ μ½μνΈ ν΄λμ€λ₯Ό ν μ€νΈνλ κ²½μ° κ³μν΄μ elvisλ₯Ό νΈμΆν΄μΌ νλ€λ λ¬Έμ κ° μλ€. (ν μ€νΈλ₯Ό μ€νν λλ§λ€ μ΄λ κ² λμνλ κ²μ λ§€μ° λΉν¨μ¨μ )
public class Concert{
private boolean lightsOn;
private boolean mainStateOpen;
private Elvis elvis;
public Concert(Elvis elvis){
this.elvis = elvis;
}
public void perform(){
mainStateOpen = true;
lightsOn = true;
elvis.sing();
}
public boolean isLightOn(){
return LightsOn;
}
public boolean isMainStateOpen(){
return mainStateOpen;
}
}
class ConcertTest{
@Test
void perform(){
Concert concert = new Concert(Elvis.INSTANCE); // ν΄κ²° λ°©λ² : new Concert(new MockElvis());
concert.perform();
assertTrue(concert.isLightsOn());
assertTrue(concert.isMainStateOpen());
}
}
ν΄κ²° λ°©λ²μ μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄μ κ°μ§(mock)λ₯Ό μ£Όλ κ²μ΄λ€.
λ λ²μ§Έ λ¨μ μ 리νλ μ μΌλ‘ private μμ±μλ₯Ό νΈμΆν μ μλ€λ κ²μ΄λ€. μλμ²λΌ κ°μ νμ μ μΈμ€ν΄μ€λ₯Ό μ¬λ¬ κ° λ§λ€ μ μλ€λ κ²μ΄λ€. μ΄μ λν ν΄κ²°μ± μ flag κ°μ μ΄μ©νμ¬ μ΄λ―Έ μΈμ€ν΄μ€κ° μμ±λ κ²½μ° λ€μ μμ±νλ κ³Όμ μμ μμΈλ₯Ό λ°μμν€λ κ²μ΄λ€.
public static void main(String[] args){
try{
Constructor<Elvis> defaultConstructor = Elvis.class.getDeclaredConstructor();
defaultConstructor.setAccessible(true);
Elvis elvis1 = defaultConstructor.newInstance();
Elvis elvis2 = defaultConstructor.newInstance();
System.out.println(elvis1 == elvis2); // false
} catch(Exception exception){
}
}
μΈ λ²μ§Έ λ¨μ μ μμ§λ ¬ν ν λ μλ‘μ΄ μΈμ€ν΄μ€κ° μκΈΈ μ μλ€λ κ²μ΄λ€. λ§μ½ readResolve()λ₯Ό μ¬μ©νλ€λ©΄ μ±κΈν΄μ΄ 보μ₯λλ€.(μλλ readResolve()λ₯Ό μ μνμ§ μμ μνμ΄λ€.)
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(ObjectOutput in = new ObjectInputStream(new FileInputStream("elvis.obj"))){
Elvis elvis3 = (Elvis) in.readObject();
System.out.prinln(elvis3 == Elvis.INSTANCE); // false;
} catch (IOException | ClassNotFoundException e){
e.printStackTrace();
}
}
}
[μ 리]
μ₯μ
- κ°κ²°νκ³ μ±κΈν΄μμ APIμ λ€μ΄λΌ μ μλ€.
λ¨μ
- μ±κΈν΄μ μ¬μ©νλ ν΄λΌμ΄μΈνΈλ₯Ό ν μ€νΈνκΈ° μ΄λ €μμ§λ€.
- 리νλ μ μΌλ‘ private μμ±μλ₯Ό νΈμΆν μ μλ€.
- μμ§λ ¬ν ν λ μλ‘μ΄ μΈμ€ν΄μ€κ° μκΈΈ μ μλ€.
2. 'private μμ±μ + μ μ ν©ν°λ¦¬ λ©μλ'λ₯Ό μ΄μ©νλ λ°©λ²
public class Elvis {
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();
}
첫 λ²μ§Έ λ°©λ²κ³Όμ μ°¨μ΄μ μ λ©μλλ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό κ°μ Έκ°λ€λ μ μ΄λ€. λ¨μ μ 첫 λ²μ§Έ λ°©μκ³Ό λμΌνλ€. μ₯μ 3κ°μ§μ λν΄μ μμ보μ.
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public static Elvis getInstance(){
return new Elvis(); // λ°λ λΆλΆ
}
public void leaveTheBuilding(){
System.out.println("Whoa baby, I'm outta here!");
}
}
첫 λ²μ§Έ, λ©μλλ₯Ό μμ κ°μ΄ λ°κΎΈκ² λλ€λ©΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό λ°κΎΈμ§ μκ³ λ μ±κΈν΄μ΄ μλκ² λ°κΏ μ μλ€.
public class MetaElvis<T> {
private static final MetaElvis<Object> INSTANCE = new MetaElvis<>();
private MetaElvis(){}
@SuppressWarnings("unchecked")
public static <T> MetatElvis<T> getInstance(){
return (MetaElvis<T>) 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();
}
λ λ²μ§Έ, μ λ€λ¦ νμ μΌλ‘ λμΌν μ±κΈν΄ μΈμ€ν΄μ€λ₯Ό μ¬μ©νκ³ μΆμ λ μμ κ°μ΄ μ λ€λ¦ μ±κΈν΄ ν©ν°λ¦¬λ₯Ό λ§λ€μ΄μ μ¬μ©ν μ μλ€. (μΈμ€ν΄μ€λ λμΌνμ§λ§ μνλ νμ μΌλ‘ λ°κΏμ μ¬μ©ν μ μμ)
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);
}
}
λ§μ§λ§μΌλ‘ μμ κ°μ΄ λ©μλ μ체λ₯Ό supplierμ ꡬν체 νλΌλ―Έν°μ λκΈΈ μ μλ€.
[μ 리]
μ₯μ
- APIλ₯Ό λ°κΎΈμ§ μκ³ λ μ±κΈν΄μ΄ μλκ² λ³κ²½ν μ μλ€.
- μ μ ν©ν°λ¦¬λ₯Ό μ λλ¦ μ±κΈν΄ ν©ν°λ¦¬λ‘ λ§λ€ μ μλ€.
- μ μ ν©ν°λ¦¬μ λ©μλ μ°Έμ‘°λ₯Ό 곡κΈμ(Supplier)λ‘ μ¬μ©ν μ μλ€.
λ¨μ
- 'private μμ±μ + public static final νλ'μ 3κ°μ§ λ¨μ κ³Ό λμΌ
3. 'μ΄κ±° νμ 'μ μ΄μ©νλ λ°©λ²
public enum Elvis{
INSTANCE;
public void leaveTheBuilding(){
System.out.println("Whoa baby, I'm outta here!");
}
}
----------
public static void main(String[] args){
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
enumμΌλ‘ μ€μ νκ³ INSTANCEλ₯Ό νλ λ§λ€λ©΄ λμ΄λ€. μ΄ λ°©λ²μ μμμ λ¨μ μΌλ‘ λμ¨ λ¦¬νλ μ κ³Ό μ§λ ¬ν&μμ§λ ¬ν λ¬Έμ μ λν΄μ λ§€μ° μμ νλ€λ κ²μ΄λ€. λ¨μ 1λ‘ λμ¨ ν μ€νΈλ₯Ό νκΈ° μ΄λ €μ΄ λ¬Έμ λ μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄μ ν΄κ²°νλλ‘ νμ.(μΈν°νμ΄μ€ ꡬνμ΄ κ°λ₯νκΈ° λλ¬Έμ ν΄κ²° κ°λ₯νλ€λ μλ―Έ)
λλΆλΆ μν©μμλ μμκ° νλλΏμΈ μ΄κ±° νμ μΌλ‘ μ±κΈν΄μ λ§λλ κ²μ΄ κ°μ₯ μ’μ λ°©λ²μ΄λ€.
μ΄μμΌλ‘ 1) private μμ±μ + public static final νλ 2) private μμ±μ + μ μ ν©ν°λ¦¬ λ©μλ 3) μ΄κ±° νμ μΌλ‘ μ±κΈν΄μ λ§λλ λ°©μμ μμ보μλ€.
ν΄λΉ κΈμ λ°±κΈ°μ λμ 'μ΄νν°λΈ μλ° μλ²½ 곡λ΅'μ μκ°νκ³ μμ±ν κ²μ λλ€.