2012-12-02 1 views
2

그래서, 나는 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에서는 거룩한 모든 것을 거부합니다. 어떤 아이디어? 개인 초기화 방법에 생성자의 코드 밖으로

답변

6

는 런타임 예외를 사용합니다. 특히,이를 위해 IllegalArgumentException이 설계되었습니다.

+0

이것은 가장 적은 수정이 필요한 가장 간단한 솔루션입니다. 감사! – brenns10

+0

결코 일어나지 않아야 할 것이므로 AssertionError를 사용하십시오. 부정한 인수가있는 경우는 IllegalArgumentException를 사용합니다. –

+0

@ PeterLawrey - 여기서 당신의 주장을 이해하지 못합니다. 나는 어쩌면 발생해서는 안되는 내부 불변 변수를 AssertionError와 관련시킨다. – jtahlborn

1

브레이크 :

public class Puzzle { 
    // Fields, methods, etc. 
    public Puzzle() { 
     construct(3); 
    } 

    public Puzzle(int n) throws Exception { 
     if (n < 2) throw new Exception(); 

     construct(n);   

    } 

    private void construct(int n) { 
     // More constructor code 
    } 
} 
+0

실용적인 아이디어이지만 개인 초기화 프로그램은 최종 회원을 사용할 수없는 고통의 원인입니다. – jtahlborn

+0

@jtahlborn 사실. 당신의 대답은 이것을하는 더 좋은 방법입니다. 그래도 실행할 수있는 솔루션을 찾으려면 +1 –

+0

+1. 나는 그런 생각을하지 않았다는 것을 믿을 수 없다. – brenns10

관련 문제