그래서 Java에서는 생성자의 첫 번째 행이 super에 대한 호출이되어야합니다. 암시 적으로 super()를 호출하거나 명시 적으로 다른 생성자를 호출해야합니다. 내가 알고 싶은 것은, 왜 그 주위에 블록을 놓을 수 없습니까?내 super() 호출에서 try 블록을 사용할 수없는 이유는 무엇입니까?
필자가 테스트 한 모의 클래스가있는 경우를 예로 들겠습니다. 기본 생성자는 없지만 테스트를 더 간단하게 만들어야합니다. 또한 생성자에서 Throw 된 예외를 RuntimeException으로 래핑하려고합니다.
public class MyClassMock extends MyClass {
public MyClassMock() {
try {
super(0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// Mocked methods
}
그러나 자바는 매우 첫 번째 문이 아닌 불평 :
그럼, 내가하고 싶은 것은 효율적이있다.
내 해결 방법 :
public class MyClassMock extends MyClass {
public static MyClassMock construct() {
try {
return new MyClassMock();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public MyClassMock() throws Exception {
super(0);
}
// Mocked methods
}
이 가장 좋은 해결 방법인가? 왜 자바는 내가 할 수 없습니까?
자바 모의를하고 그러나 ... 나에게 잠재적으로 일치하지 않는 상태에서 구성 객체를 보자 싶어하지 않는다는 것입니다 "왜"를, 난 상관 없어에로 내 추측 그것에 대해. 내가 위를 할 수 있어야한다고 생각합니다 ... 아니면 최소한 나는 위의 것이 나의 경우에 안전하다는 것을 안다. 또는 어쨌든 그래야만하는 것처럼 보인다.
테스트 된 클래스에서 사용하는 메서드를 재정의하므로 초기화되지 않은 변수를 사용할 위험이 없습니다.
흥미로운 사실은 이것이 순수한 Java 언어 제한이라는 것입니다. 동등한 바이트 코드는 완벽하게 유효합니다. – Antimony
바이트 코드가 여전히 유효합니까? 나는 아래에 설명 된 결과 보안 구멍을 누군가가 착취 한 후 무효화되는 것을 상기합니다. – Joshua
규칙에서 허용하지 않기 때문입니다. [JDK 스펙] (http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10)을 읽으십시오. 컴파일러를 지나치더라도 검증자가이를 거부합니다. –