2010-12-08 4 views
5

나는 최근에 정적 ArrayList를 초기화하기위한 새로운 문법으로 나에게 보이는 것을 발견했다 :
new ArrayList() {{ add("first"); add("second"); }};
정말 ArrayList를 초기화에 {{구문합니까 무엇

내 질문은, 정말 무슨 일을 그곳에? 그 정적 블록을 정의하기위한 지름길 (나는 그것이 static 키워드가 필요하다고 생각)인가? 아니면 그냥 기본 생성자를 정의하는 방법? 다른 것? 어떤 Java 버전이 유효합니까?

추가 설명에 대한 설명과 링크는 크게 감사하겠습니다.

편집 : 이니셜 라이저 블록이 생성자 전후에 실행되는지 여부를 보여주는 내 테스트 클래스.

import org.junit.Test; 

public class InitializerBlockTest { 
    class InitializerTest { 
     { 
     System.out.println("Running initalizer block"); 
     } 

     public InitializerTest() { 
      System.out.println("Running default constructor"); 
     } 
    } 

    class SubClass extends InitializerTest { 
     { 
     System.out.println("Running subclass Initializer block"); 
     } 

     public SubClass() { 
     System.out.println("Running subclass constructor"); 
     } 
    } 

    @Test 
    public void testIt() { 
     new SubClass(); 
    } 
} 

출력 : 당신은 ArrayList를 새로운 익명 서브 클래스를 만드는

Running initalizer block 
Running default constructor 
Running subclass Initializer block 
Running subclass constructor 
+0

어디에서이 새로운 구문을 찾았습니까? 기사 또는 공유 할 항목에 대한 링크가 있습니까? – romacafe

+0

BTW : 혼란에 빠지면 클래스의 임의의 위치에 정적 ({} 및 {}) 블록을 얼마든지 가질 수 있습니다 (물론 메서드 정의 외부) –

+0

관련 : http://stackoverflow.com/questions/924285/efficiency- of-java-double-brace-initialization 그것은 새로운 것은 아닙니다. 이미 여러 해 동안 자바로 왔습니다. 그것은 실제로 거의 사용되지 않으며 좋은 이유가 있습니다. – BalusC

답변

6

을 두 번()를 추가 호출하는 인스턴스 초기화와 결과는 초기화 블록이 다른 생성자 코드 앞에 실행하는 것을 보여줍니다. 이 클래스 파일 폭발로 이어질 것이기 때문에 개인적으로, 나는, 관용구로 조언을하지 않는 것을

class MyList extends ArrayList 
{ 

{ // This is an instance initializer; the code is invoked before the constructor. 
add("first"); 
add("second"); 
} 

public MyList() { 
    super(); 
    // I believe initializers run here, but I have never specifically tested this 
    } 
} 

...

List list=new MyList(); 

참고 :

그것은 동일합니다.

+0

super() 호출 전후에 이니셜 라이저가 호출되는지 여부에 대해 누구라도 신경 쓰시겠습니까? –

+0

항상 첫 번째로 불리는 것과 같이 super()로 시작해야합니다. –

+0

빠른 답변 주셔서 감사합니다. 이전/이후에 대해서는 빠른 테스트 클래스를 만들었고 이전에 이니셜 라이저 블록을 실행했습니다. – Gus

4

이것은 인스턴스 변수의 초기화 프로그램 블록입니다.

오라클의 문서에서

:

이니셜 변수, 정적 인 초기화 블록처럼 예를 들어 있지만, 정적 키워드가없는 블록 :

{ 

    // whatever code is needed for initialization goes here 
} 

자바 컴파일러 사본 이니셜 라이저 모든 생성자에 블록. 따라서이 방법은 을 사용하여 다중 생성자간에 코드 블록을 공유 할 수 있습니다.

참조 : 당신이 new ArrayList() { }을 쓸 때 http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

3

당신이 ArrayList의 익명의 하위 클래스를 만들 수 있습니다. 코드에서 가장 안쪽 괄호 안에있는 { }은 이니셜 라이저 블록을 나타내며 실제로 모든 생성자에 복사됩니다.

편집 : 너희들은 확실히 빨리 대답한다!