일반적으로 비 정적 초기화 블록을 사용하지 마십시오 (정적 블록도 피하십시오).
혼란스러운 구문
이 질문을 보면 3 가지 답변이 있지만이 구문으로 4 명을 속였습니다. 나는 그들 중 하나였으며 16 년 동안 Java를 작성해 왔습니다! 분명히 구문은 오류가 발생하기 쉽습니다! 나는 멀리 떨어져있을 것입니다.
텔레 스코핑 생성자
정말 간단한 것들을 위해, 당신은이 혼란을 피하기 위해 "telescoping"생성자를 사용할 수 있습니다 :
public class Test {
private String something;
// Default constructor does some things
public Test() { doStuff(); }
// Other constructors call the default constructor
public Test(String s) {
this(); // Call default constructor
something = s;
}
}
빌더 패턴
각 생성자 또는 기타 복잡한 초기화가 끝날 때 doStuff ()를 수행해야하는 경우 빌더 패턴이 가장 좋습니다. Josh Bloch 는 빌더가 좋은 아이디어 인 몇 가지 이유를 나열합니다. 빌더는 작성하는 데 약간의 시간이 걸리지 만 올바르게 작성되었으므로 사용하는 것이 좋습니다.
public class Test {
// Value can be final (immutable)
private final String something;
// Private constructor.
private Test(String s) { something = s; }
// Static method to get a builder
public static Builder builder() { return new Builder(); }
// builder class accumulates values until a valid Test object can be created.
private static class Builder {
private String tempSomething;
public Builder something(String s) {
tempSomething = s;
return this;
}
// This is our factory method for a Test class.
public Test build() {
Test t = new Test(tempSomething);
// Here we do your extra initialization after the
// Test class has been created.
doStuff();
// Return a valid, potentially immutable Test object.
return t;
}
}
}
// Now you can call:
Test t = Test.builder()
.setString("Utini!")
.build();
정적 이니셜 라이저 루프
나는 정적 이니셜 라이저를 많이 사용 했지만 때로는 클래스가 완전히로드되기 전에 두 개의 클래스가 서로의 정적 이니셜 라이저 블록에 의존하는 루프가 발생했습니다. 이로 인해 "클래스를로드하지 못했습니다"또는 유사하게 모호한 오류 메시지가 나타납니다. 문제가 무엇인지 파악하기 위해 소스 컨트롤에서 마지막으로 알려진 작동 버전과 파일을 비교해야했습니다. 전혀 재미 없다.
게으른 초기화
정적 이니셜 라이저는 작동하기 때문에 성능상의 이유로 좋으며 너무 혼란스럽지 않을 수 있습니다. 그러나 일반적으로 요즘에는 정적 초기화 프로그램 보다 게으른 초기화 를 선호 합니다. 그들이하는 일이 분명하고, 아직 클래스 로딩 버그에 빠지지 않았으며 초기화 블록보다 더 많은 초기화 상황에서 작동합니다.
데이터 정의
데이터 구조를 만들기위한 정적 초기화 (다른 답변의 예제와 비교) 대신 Paguro의 불변 데이터 정의 도우미 함수를 사용합니다 .
private ImMap<String,String> days =
map(tup("mon", "monday"),
tup("tue", "tuesday"),
tup("wed", "wednesday"),
tup("thu", "thursday"),
tup("fri", "friday"),
tup("sat", "saturday"),
tup("sun", "sunday"));
추방
Java의 초기에는 이니셜 라이저 블록이 일부 작업을 수행하는 유일한 방법 이었지만 지금은 혼란스럽고 오류가 발생하기 쉬우 며 대부분의 경우 더 나은 대안으로 대체되었습니다 (위에서 자세히 설명). 레거시 코드에서 볼 수 있거나 테스트 중일 때 초기화 블록에 대해 아는 것이 흥미 롭습니다.하지만 코드 검토를 수행하고 새 코드에서 하나를 보았을 때 위의 대안은 코드에 엄지 손가락을 넣기 전에 적합했습니다.