즉, 인스턴스 이니셜 라이저가 필요한 이유는 무엇입니까? 생성자보다 인스턴스 이니셜 라이저를 작성할 때 어떤 차이점이나 이점이 있습니까?
답변:
이것은 잘 설명하는 것 같습니다.
인스턴스 이니셜 라이저는 다음과 같은 경우 인스턴스 변수 이니셜 라이저의 유용한 대안입니다.
이니셜 라이저 코드는 예외를 포착해야합니다.
인스턴스 변수 이니셜 라이저로 표현할 수없는 멋진 계산을 수행합니다. 물론 생성자에서 이러한 코드를 항상 작성할 수 있습니다.
그러나 여러 생성자가있는 클래스에서는 각 생성자에서 코드를 반복해야합니다. 인스턴스 이니셜 라이저를 사용하면 코드를 한 번만 작성할 수 있으며 객체를 생성하는 데 사용되는 생성자가 무엇이든 상관없이 실행됩니다. 인스턴스 이니셜 라이저는 생성자를 전혀 선언 할 수없는 익명의 내부 클래스에서도 유용합니다.
개체 수명주기 측면에서 차이가 없습니다. 둘 다 생성시에 호출되며 논리적으로 초기화 블록은 생성의 일부로 간주 될 수 있습니다.
의미 상 이니셜 라이저는 여러 가지 이유로 좋은 도구입니다.
이니셜 라이저는 초기화되는 변수 옆에 초기화 로직을 유지하여 코드 가독성을 향상시킬 수 있습니다.
public class Universe {
public int theAnswer;
{
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
}
// a bunch of other vars
}
vs
public class Universe {
public int theAnswer;
// a bunch of other vars
public Universe() {
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
// other constructor logic
}
}
이니셜 라이저는 사용되는 생성자에 관계없이 호출됩니다.
이니셜 라이저는 생성자가 할 수없는 익명의 내부 클래스에서 사용할 수 있습니다.
theAnswer
는 선언 된 인스턴스 변수입니다. 익명 이니셜 라이저 블록에서 초기화됩니다. 변수 선언 뒤의 세미콜론에 유의하십시오.
일반적으로 인스턴스 이니셜 라이저 관용구를 피할 것입니다. 변수 이니셜 라이저에 비해 유일한 실제 이점은 예외 처리입니다.
그리고 init 메서드 (생성자에서 호출 가능)도 예외 처리를 수행하고 생성자 설정 코드를 중앙 집중화 할 수 있지만 생성자 매개 변수 값에 대해 작동 할 수 있다는 이점이 있기 때문에 인스턴스 이니셜 라이저가 중복되므로 피했다.
객체 생성시 인스턴스 변수의 초기화를 수행하려면 생성자에 가야합니다. 객체 생성시 어떤 활동을 수행하려면 초기화 활동이 아닌 생성자로 가야하며 인스턴스 블록으로 가야합니다.
생성자는 인수를받을 수 있지만 인스턴스 블록은 인수를받을 수 없기 때문에 생성자를 인스턴스 블록으로 바꿀 수 없습니다.
클래스가 하나 이상의 생성자를 포함 할 수 있기 때문에 생성자 인스턴스 블록을 대체 할 수 없습니다. 인스턴스 블록을 생성자로 대체하려면 모든 생성자에서 인스턴스 블록 코드를 작성해야합니다. 런타임시 어떤 생성자가 호출 될지 예상 할 수 없기 때문에 중복 코드가 불필요하게 증가합니다.
예 :
class MyClass{
static int object_count = 0;
MyClass(){
object_count++;
}
MyClass(int i){
object_count++;
}
void getCount() {
System.out.println(object_count);
}
public static void main(String... args) {
MyClass one = new MyClass();
MyClass two = new MyClass(2);
two.getCount();
}
}
출력 : 2
class MyClass{
static int object_count = 0;
{
object_count++;
}
MyClass(){
}
MyClass(int i){
}
void getCount() {
System.out.println(object_count);
}
public static void main(String... args) {
MyClass one = new MyClass();
MyClass two = new MyClass(2);
two.getCount();
}
}
출력 : 2