2013-04-05 5 views
0

Effective Java - 싱글 톤 보장을 유지하려면 은 모든 인스턴스 필드를 일시적으로 선언하고 'readResolve'메소드를 제공해야합니다. 필드를 일시적으로 선언하면 무엇을 얻을 수 있습니까?싱글 톤을 serialize하기위한 transient

에 관계없이 나는 일시적으로 '국가'변수를 선언 여부에
.... 
.... 
public final class MySingleton implements Serializable{ 
private int state; 
private MySingleton() { state =15; } 
private static final MySingleton INSTANCE = new MySingleton(); 
public static MySingleton getInstance() { return INSTANCE; } 
public int getState(){return state;} 
public void setState(int val){state=val;} 
private Object readResolve() throws ObjectStreamException { 
    return INSTANCE; 
} 
    public static void main(String[] args) { 
     MySingleton c = null; 
     try { 
      c=MySingleton.getInstance(); 
      c.setState(25); 
      FileOutputStream fs = new FileOutputStream("testSer.ser"); 
      ObjectOutputStream os = new ObjectOutputStream(fs); 
      os.writeObject(c); 
      os.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      FileInputStream fis = new FileInputStream("testSer.ser"); 
      ObjectInputStream ois = new ObjectInputStream(fis); 
      c = (MySingleton) ois.readObject(); 
      ois.close(); 
      System.out.println("after deser: contained data is " + c.getState()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

, 내가 c.getState() (25) 로 인쇄 gettign 얻을 내가 여기서 뭔가를 놓치고 있습니까 : 다음은 샘플입니까?

+0

'상태'가 일시적이든 아니든간에 언급 한 바와 같이 결과는 다르지 않습니다. – IUnknown

답변

1

속성을 일시적으로 만들면 얻을 수있는 것은 상태를 직렬화하지 않는다는 것입니다. readResolve() 메소드에 의해 버려지기 때문에 직렬화는 불필요합니다.

상태가 int로 구성되어 있으면 큰 문제가되지 않습니다. 그러나 상태가 객체의 복잡한 그래프 인 경우 중요한 성능 차이가 발생합니다. 물론 상태가 직렬화되지 않으면 다른 선택의 여지가 없습니다.

즉, 싱글 톤을 직렬화하는 것은 의문의 여지가 있습니다.

0

"상태"변수를 일시적으로 선언하는지 여부에 관계없이 c.getState() gettign이 25로 인쇄됩니다. 여기에 누락 된 항목이 있습니까?

readResolve()는 MySingleton의 개인 정적 인스턴스를 반환하므로 deserialization에서 반환 된 인스턴스를 재정의합니다.

0

개체에 값을 설정하면 25가됩니다. 위의 코드를 참조하십시오. 그 대답이 15 살이라고 생각 했었나?

관련 문제