728x90
반응형
- 우리가 제대로 만들었지만 사용자가 이상하게 사용하면 깨질 수 있음
public class App{
public static void main(String[] args){
Settings settings = Settings.getInstance();
Settings settings1 = Settings.getInstance();
System.out.println(settings == settings1);
}
}
- 지금은 true인데 이것을 false로 나오는것은
- 어떻게 선언하냐면 리플렉션을 사용
리플렉션 사용하기
public class App{
public static void main(String[] args) throws NoSuchMethodException{
Settings settings = Settings.getInstance();
Constructor<Settings> constructor = Settings.class.getDeclaredConstructor();
constructor.setAccessible(true);
Settings settings1 = Settings.getInstance();
System.out.println(settings == settings1);
}
}
- 이 경우 new로 그냥 선언하는것과 비슷하기떄문에 false가 나오게됨
직렬화 & 역 직렬화 사용하기
- 직렬화
- 저장할때는 이것
- 역직렬화
- 불러올때
public class Settings implements Serializable{
private Settings(){}
private static class SettingsHolder{
private static final Settings INSTANCE = new Settings();
}
public static synchronized Settings getInstance(){
return SettingsHolder.INSTNACE ;
}
}
public class App{
public static void main(String[] args) throws IOException{
Settings settings = Settings.getInstance();
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);
}
}
- 객체를 파일로 저장했다가 불러올 수있음
- 역직렬화를 사용하면 다시 new를 불러와서 사용하기 때문에 다른것이다.
- 역직렬화 무마 시키는 법은
- 명시적으로 써있지 않지만
- 직렬화할때 아래 매소드 사용함
protected Object readResolve(){
}
- 위에서 원래new를 사용해서 만들어서 다른 인스턴스를 생성되는데
역직렬화 대응 방안
public class Settings implements Serializable{
private Settings(){}
private static class SettingsHolder{
private static final Settings INSTANCE = new Settings();
}
public static synchronized Settings getInstance(){
return SettingsHolder.INSTNACE ;
}
}
protected Object readResolve(){
return getInstance();
}
- 이렇게 선언을 하게되면 해결을 된다.
- 역직렬화는 대응이 되지만 리플랙션은 대응이 어렵다.
728x90
반응형
'CS Study > 디자인패턴' 카테고리의 다른 글
2021.11.14_05.자바와스프링에서찾아보는패턴 (0) | 2021.11.14 |
---|---|
2021.11.14_04.안전하고단순하게구현하는방법 (0) | 2021.11.14 |
2021.11.14_02.멀티쓰레드환경에서안전하게구현하는방법 (0) | 2021.11.14 |
2021.11.11_싱글톤패턴1-싱글톤패턴을가장단순히구현하는방법 (0) | 2021.11.11 |
21.11.07_1.2디자인패턴의세계에오신것을환영합니다 (0) | 2021.11.08 |
댓글