2013-06-17 2 views
3

나는 그런 클래스 다른 개발자가 작성한 :클래스 본문의 중괄호는 무엇을합니까?

public class ManifestFile implements Serializable { 

private final static DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
private final static XPathFactory xPathFactory = XPathFactory.newInstance(); 
private final static DateFormat YYYYMMDD = new SimpleDateFormat("yyyyMMdd"); 
private final String uuid; 
private final Set<File> attachments = new LinkedHashSet<File>(); 
private final transient ApplicationContext applicationContext = JavaService.INSTANCE.getApplicationContext(); 
private final transient File attachmentDirectory; 
private final Date processAfter = new Date(System.currentTimeMillis() + 3 * 1000 * 60); 

{ 
    try { 
     documentBuilderFactory.setNamespaceAware(true); 
     final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = sf.newSchema(new StreamSource(getClass().getResourceAsStream("/StrategicEmail5.xsd"))); 
     documentBuilderFactory.setSchema(schema); 
     documentBuilderFactory.setValidating(true); 
    } catch (Throwable t) { 
     throw new RuntimeException(t); 
    } 
} 

나는이 부분에 의해 놀랜다 :

{ 
try { 
    documentBuilderFactory.setNamespaceAware(true); 
    final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = sf.newSchema(new StreamSource(getClass().getResourceAsStream("/StrategicEmail5.xsd"))); 
    documentBuilderFactory.setSchema(schema); 
    documentBuilderFactory.setValidating(true); 
} catch (Throwable t) { 
    throw new RuntimeException(t); 
} 
} 

누군가가 설명해 주 시겠어요가 유효이 코드와 사용의 장점은 {} 무엇인가 어떤 방법의 몸 밖에서?

답변

6

인스턴스 초기화 프로그램 블록입니다. 클래스의 인스턴스 초기화의 일부로 호출됩니다.

클래스이 초기화되면 해당 블록을 "정적"으로 시작하여 한 번 호출 할 수도 있습니다. 이를 정적 이니셜 라이저라고합니다. Java Language Specification에서

:

8.6. 인스턴스 초기화 자

클래스에서 선언 된 인스턴스 초기화 프로그램은 클래스 인스턴스가 생성 될 때 실행됩니다 (§12.5, §15.9, §8.8.7.1). ...

  • 그것은 인스턴스 초기화가 정상적으로 완료 할 수없는 경우 컴파일 타임 오류가 발생 (§14.21).
  • return 문 (14.17 절)이 인스턴스 이니셜 라이저의 아무 곳에 나 나타나면 컴파일 타임 오류가 발생합니다.
  • 인스턴스 초기화 프로그램은 키워드 this (§15.8.3)를 통해 현재 개체를 참조하고, 키워드 super (§15.11.2, §15.12)를 사용하고 범위에 유형 변수를 사용하도록 허용됩니다.
  • 사용 후 문자로 나타나는 선언을 사용하는 인스턴스 변수는 해당 인스턴스 변수가 범위에 있더라도 사용이 제한되는 경우가 있습니다. 인스턴스 변수에 대한 전방 참조를 규율하는 정확한 규칙은 §8.3.2.3을 참조하십시오.

인스턴스 초기화 프로그램에 대한 예외 검사는 11.2.3 절에 지정되어 있습니다.

+0

대단히 감사합니다. 당신과 정답을 제공 한 다른 사람들에게. –

3

인스턴스 초기화 프로그램입니다. 객체가 생성 될 때 생성자에있는 super() 바로 뒤에 호출됩니다. 주요 인쇄이 두 줄을 실행

public class Test { 
    //instance initializer 
{ 
    System.out.println("init block"); 
} 

    public Test() { 
     super(); 
     System.out.println("constructor"); 
    } 

     //invoke to test 
    public static void main (String ... args) { 
     new Test(); 
    } 
} 

:

아래의 예를 참조하십시오

public Test() { 
    super(); 
    { 
     System.out.println("init block"); 
    } 
    System.out.println("constructor"); 
} 
다음 생성자 실제로 이런 일을 찾기 때문이다

init block 
constructor 

0

대괄호는 인스턴스의 초기화를 나타냅니다. zer. 이것은 생성자가 실행되기 전에 직접 실행됩니다.

0

이것은 인스턴스 이니셜 라이저 블록입니다.Java 컴파일러는 초기화 프로그램 블록을 모든 생성자에 복사합니다. 따라서이 방법을 사용하여 여러 생성자간에 코드 블록을 공유 할 수 있습니다.

2

인스턴스 초기화 블록입니다. 인스턴스 초기화 블록 코드는 생성자에서 super()을 호출 한 직후, 즉 모든 슈퍼 생성자가 실행 된 후에 실행됩니다. 초기화 블록이 클래스에서 나타나는 순서는 중요합니다. 클래스가 둘 이상이면 클래스 파일에 나타나는 순서대로 모두 실행됩니다.

Some rules to remember: 
1.Initialization blocks execute in the order they appear. 
2.Static Initialization blocks run once when the class is first loaded. 
3.Instance Initialization blocks run every time a class instance is created. 
4.Instance Initialization blocks run after the constructor’s call to super(). 

자세한 내용은 here을 클릭하십시오.

관련 문제