그래서, 나는 Puzzle
이라는 클래스와 그에 대한 두 개의 (관련있는) 생성자를 가지고 있습니다. 하나의 생성자는 args를받지 않고, 다른 생성자는 int를 취하고 예외를 throw합니다. 기본적인 아이디어는 다음과 같이이다 :이 불필요한 throws 문을 생성자에서 피할 수있는 방법은 무엇입니까?
public class Puzzle {
// Fields, methods, etc.
public Puzzle() {
this(3);
}
public Puzzle(int n) throws Exception {
if (n < 2) throw new Exception();
// More constructor code
}
}
,이 컴파일되지 않습니다, int를 취하는 생성자가 예외를 발생하고, 인수가없는 생성자가 처리하거나 예외를 발생하지 않기 때문에. 그러나 예외가 결코 throw되지 않을 것이라는 것은 명백하므로 (생성자의 본문에 예외가 더 이상 throw되지 않음) 중요하지 않습니다. 난 그냥 같이 빈 시도-catch 문을 사용할 수
public Puzzle() {
try {
this(3);
} catch (Exception e) {
// Never happens
}
}
여기서 문제가 this(3)
에 대한 호출이 더 이상 생성자의 첫 번째 문이라는 것이다, 그래서 그것을 컴파일되지 않습니다. 그것은 비록 내가 예외를 던질 수 없다는 것을 알고 있지만이 생성자를 throws
절로 표시해야하는 것처럼 보입니다. 호출 코드가 불필요한 try-catch 블록을 필요로하거나 예외를 던져야하기 때문에 이것은 정말로 성가시다. 이 주변에 내가 누락 된 우아한 방법이 있습니까? 몇 가지 코드를 쉽게 복사하여 붙여 넣을 수는 있지만 OOP에서는 거룩한 모든 것을 거부합니다. 어떤 아이디어? 개인 초기화 방법에 생성자의 코드 밖으로
이것은 가장 적은 수정이 필요한 가장 간단한 솔루션입니다. 감사! – brenns10
결코 일어나지 않아야 할 것이므로 AssertionError를 사용하십시오. 부정한 인수가있는 경우는 IllegalArgumentException를 사용합니다. –
@ PeterLawrey - 여기서 당신의 주장을 이해하지 못합니다. 나는 어쩌면 발생해서는 안되는 내부 불변 변수를 AssertionError와 관련시킨다. – jtahlborn