다음 코드에서 {{ ... }}
블록의 의미는 무엇입니까?새로운 클래스 (...)의 의미 {{...}} 초기화 관용구
class X {
private Y var1;
private X() {
Z context = new Z(new SystemThreadPool()) {{
var1 = new Y();
}};
}
}
다음 코드에서 {{ ... }}
블록의 의미는 무엇입니까?새로운 클래스 (...)의 의미 {{...}} 초기화 관용구
class X {
private Y var1;
private X() {
Z context = new Z(new SystemThreadPool()) {{
var1 = new Y();
}};
}
}
double curly brace initialization입니다. (편집 : 링크 제거, archived here)
이것은 익명의 하위 클래스를 만들고 이중 중괄호 안의 코드는 기본적으로 생성자임을 의미합니다. 기본적으로 컬렉션 상수를 생성하는 Java의 구문은 다소 어색하기 때문에 컬렉션에 내용을 추가하는 데 자주 사용됩니다. 실제로 그렇게하지
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
과이 작업을 수행하는 것을 선호 :
List<String> list = new ArrayList<String>() {{
add("one");
add("two");
add("three");
}};
대신 :
그래서 당신이 할 수있는List<String> list = Arrays.asList("one", "two", "three");
는 그래서 '아무튼 이 경우에는 유용한 정보를 얻지 못하는지도와는 달리 의미가 있습니다.
@skaffman [fluid app]은 [JATL] (http://code.google.com/p/jatl) 시도. –
Arrays.asList()는 기능이 제한적인 java.util.ArrayList가 아니라 java.util.Arrays.ArrayList.ArrayList를 반환합니다. – Asaf
이 기술은 까다 롭고 몇 가지주의 사항이 있습니다. 정당한 이유없이 깨진 equals() 계약 또는 증가 된 메모리 사용으로 끝날 수 있습니다. 자신이하는 일을 정확히 알지 않는 한 이중 중괄호 초기화를 피하는 것이 좋습니다. 자세한 내용은 [this] (http://www.ayp-sd.blogspot.com/2012/12/double-brace-initialization-in-java.html) 게시물을 참조하십시오. –
"외부"중괄호는 익명 하위 클래스를 만들고, 두 번째 중괄호는 개체 이니셜 라이저입니다. 이니셜 라이저는 클래스의 생성자 이전에 실행되지만 super
호출 이후 (따라서 수퍼 클래스 이니셜 라이저 이후에도) 실행됩니다. 익명이 아닌 클래스에서 이니셜 라이저를 사용할 수도 있습니다. 이는 서로를 호출 할 수없는 여러 생성자가 있거나 일반적인 필드 초기화 프로그램에서 허용하는 것보다 더 복잡한 초기화가 필요한 필드가있는 경우 final
필드를 시작하는 편리한 방법입니다. 이니셜이 확인이 끝난 예외를 던질 수 있다면 모든 생성자는 그들이 그것을 던질 수 선언해야합니다,
class X extends Y{
private final int lulz;
private static boolean someCondition(){...}
private static boolean danger() throws SomeException { ... }
{ // initalizer -- might throw SomeException!
lulz = someCondition()? danger() : 0;
}
public X(A a) throws SomeException { super(a); }
public X(B b) throws SomeException { super(b); }
}
:
class X extends Y{
private final int lulz;
private static boolean someCondition(){...}
private static boolean danger() throws SomeException { ... }
public X(A a) throws SomeException {
super(a);
lulz = someCondition()? danger() : 0;
}
public X(B b) throws SomeException {
super(b);
lulz = someCondition()? danger() : 0;
}
}
그것은으로 다시 작성할 수 있습니다 :
이 클래스를 생각해 보자.당신은 anonymous class를 생성하고이처럼 class Instance initialize R 관용구를 사용하고 있습니다 :
이전 답변에서 언급 한 바와 같이class X {
private Y var1;
private X() {
Z context = new Z(
new SystemThreadPool()) {
{ // This is the initialize idiom
var1 = new Y(); //
} //
}
); // BTW you are missing ")"
}
}
, 이중 중괄호 초기화가 올바른지.
특정 기술을 사용하여 Java에서 인스턴스 구성원을 초기화합니다. 클래스 생성자 중 하나가 활성화 될 때 실행되는 공유 된 코드 블록을 클래스 정의에 정의하는 간단한 방법입니다.
official Java documentations에 링크를 추가하여 주제에 대한보다 폭 넓은 정보를 제공합니다.에서
인스턴스 변수에 대한초기화 블록 정적 인 초기화 블록처럼,하지만 static 키워드없이 볼 :
{
// whatever code is needed for initialization goes here
}
Java 컴파일러는 이니셜 라이저 블록을 int로 복사합니다. 모든 생성자. 따라서이 방법을 사용하면 다중 생성자간에 코드 블록을 공유 할 수 있습니다.
이중 중괄호는 Google에 쉽지 않습니다. –
@Tom Hawtin : 대신 Google에 "double brace"를 사용할 수 있습니다 ... –