2021.11.14_04.안전하고단순하게구현하는방법
본문 바로가기
CS Study/디자인패턴

2021.11.14_04.안전하고단순하게구현하는방법

by KyeongMin 2021. 11. 14.
728x90
반응형
public enum Settings{
    
  	INSTANCE;
    
  Settings(){
	
  }
  private Integer number;
  
  public Integer getNumber(){
    return number;
  }
  public void setNumber(Integer number){
        this.number = number;
  }
}

// 줄인것 // 리플랙션에 안전한 코드
public enum Settings{
    
  	INSTANCE;
}



public class App{
    
    public static void main(String[] args) throws NoSuchMethodException{
        Settings settings = Settings.INSTANCE;
        
        Constructor<Settings> constructor = Settings.class.getDeclaredConstructor();
        constructor.setAccessible(true);
        Settings settings1 = Settings.getInstance();
        
       	System.out.println(settings == settings1);
    }   
}
  • show byte code를 보면 기본 생산자 못가져옴
public class App{
    
    public static void main(String[] args) throws NoSuchMethodException{
        Settings settings = Settings.INSTANCE;
      
      	Settings settings1 = null;

        Constructor<?>[] declaredConstructors = Settings.class.getDeclaredConstructors();
      	for(Constructor<?> constructor : declaredConstructors){
        constructor.setAccessible(true);
        settings1 = (Settings) constructor.newInstance("INSTANCE");
        }        
       	System.out.println(settings == settings1);
    }   
}
  • 모든 생성자 가져와서 확인해봐도 리플랙스를 막음 , enum은 리프랙션에서 만들 수 없어서 막을 수 있음
  • 그래서 유일한 인스턴스가 보장이 되는것임
  • 단점은 미리 만들어진다는 점
    • 상속을 쓰지 못함, 오로지 컴파일 할때 enum만 상속 가능

enum의 직렬화 역직렬화

public class App{
    
    public static void main(String[] args) throws NoSuchMethodException{
        Settings settings = Settings.INSTANCE;
      	Settings settings1 =null;
   try(ObjectOutput out = new ObjectOutPutStreamd(new FileOutPutStream("settings.obj"))){
					out.writeObject(settings);
       }//객체가 파일에 써짐, 직렬화
        
        try(ObjectInput in = new ObjectInputStream(new FileInputStream("settings.obj"))){
					settings1 =(Settings) in.readObject();
        }//역직렬화
        
       	System.out.println(settings == settings1);
    }   
}
  • enum으로 되어있는것은 역직렬화하더라도 같은 인스턴스임

복습

  • 자바에서 enum을 사용하지 않고 싱글톤 패턴을 구현하는 방법은?
  • private 생성자와 static 메소드를 사용하는 방법의 단점은?
  • enum을 사용해 싱글톤 패턴을 구현하는 방법의 장점과 단점은?
  • static inner 클래스를 사용해 싱글톤 패턴을 구현하라.

https://github.com/3DPIT/study/blob/master/05.%EC%BD%94%EB%94%A9%EC%9C%BC%EB%A1%9C%ED%95%99%EC%8A%B5%ED%95%98%EB%8A%94GoF%EC%9D%98%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/01.%EA%B0%9D%EC%B2%B4%EC%83%9D%EC%84%B1%EA%B4%80%EB%A0%A8%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/2021/11/1114/01.%EC%8B%B1%EA%B8%80%ED%86%A4%ED%8C%A8%ED%84%B4/04.%EC%95%88%EC%A0%84%ED%95%98%EA%B3%A0%EB%8B%A8%EC%88%9C%ED%95%98%EA%B2%8C%EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94%EB%B0%A9%EB%B2%95/2021.11.14_04.%EC%95%88%EC%A0%84%ED%95%98%EA%B3%A0%EB%8B%A8%EC%88%9C%ED%95%98%EA%B2%8C%EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94%EB%B0%A9%EB%B2%95.md

 

GitHub - 3DPIT/study

Contribute to 3DPIT/study development by creating an account on GitHub.

github.com

 

728x90
반응형

댓글