2012-02-19 6 views
3

더블 브레이스 :자바 나는 다음과 같은 개체 초기화 리팩토링 한 초기화

Req r = new Req(); 
r.set_f1("A"); 
r.set_f2(123); 
r.set_f3(123.456); 

속을 :

Req r = new Req() {{ 
    set_f1("A"); 
    set_f2(123); 
    set_f3(123.456) 
}}; 

두 번째 샘플은 다음 이클립스 경고가 제기

직렬화 가능 클래스가 수행을 long 형의 static final serialVersionUID 필드를 선언하지 말것.

나는이 코드 샘플이 동일해야한다고 생각했는데, 그 차이점은 무엇입니까?

+4

이 두 가지는 절대적으로 동일하지 않으며 매우 다릅니다. SO는 이중 중괄호 초기화에 대한 이전 질문으로 가득 차 있습니다. – skaffman

+0

@duffymo 당신은 이것에 절대적으로 틀림 없습니다. – Irfy

+1

그런 식으로 원래 예제를 "리팩터링"하기로 결정한 이유는 무엇입니까?! 이중 브레이스 초기화가 널리 사용되는 것은 아닙니다! Req의 생성자가 데이터를 받아 들일 수있게하는 방법 : Req req = new Req (x, y, z); –

답변

2

기본 클래스가 java.io.Serializable을 구현하는 경우 하위 클래스는 serialVersionUID이어야합니다. 내부 클래스는 직렬화 할 수 없습니다.

데이터를 직렬화하려는 다른 코드에 노출되도록이 코드로 작성된 객체를 계획하는 경우 이중 중괄호 관용구를 사용하지 마십시오 (writeReplace과 함께 사용할 수 있지만 비트 못생긴). 당신의 코드가 serilisation과 접촉하지 않을 것이라는 확신이 들면, 가능한 가장 넓은 범위에서 @SuppressWarnings("serial")을 붙이십시오.

6

두 번째 것은 익명 하위 클래스를 만들고 이름없는 초기화 프로그램으로 초기화합니다. Req이 직렬화 가능한 경우 그 하위 클래스가 있으므로 serialVersionUID을 정의해야합니다.