2009-12-18 4 views
2
public static List<Long> abc = new ArrayList<Long>(){{ //Asks for SerialVersionUID 
     abc.add(5L); 
     abc.add(7L); 
    }}; 

public static List<Long> abc = new ArrayList<Long>();//Does not need SerialVersionUID 
    static{ 
     abc.add(5L); 
     abc.add(7L); 
    } 
+2

귀하의 질문에 답변 해 드리며 동일합니다. http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization – valli

+1

ack! 두 예제 모두 public static * modifiable * 목록을 작성하고 있습니다. 매우 나쁜 것입니다. –

+1

@Kevin 두 가지 예에서 공공 정적 수정 가능 목록을 만드는 것은 무엇을 의미합니까? 대안은 무엇입니까? – DKSRathore

답변

5

두 번째 예에서는 이미 serialVersionUID (즉 ArrayList)으로 정의 된 클래스를 인스턴스화합니다.

첫 번째 예제에서는 ArrayList의 익명 하위 클래스를 정의하고 있고 하위 클래스에는 자체 serialVersionUID이 정의되어 있어야합니다. 이중 중괄호 초기화가 실제로 익명 클래스를 정의한다는 것이 항상 명확하지는 않습니다.

3

첫 번째 예에서는 "이중 중괄호 초기화"를 통해 ArrayList의 익명 하위 클래스를 만들고 있기 때문에 ArrayList는 Serializable 인터페이스를 구현합니다. SerialVersionUID는 직렬화 복원에 사용되며 엄격하게 필요하지는 않지만 직렬화를 제공하는 것이 좋습니다. IDE가이 경고를보고하도록 구성되었을 수 있습니다.

두 번째 예제에서는 ArrayList의 익명 하위 클래스를 만들지 않고 하나만 인스턴스화하고 해당 메서드를 호출합니다.

관련 문제