2

そのため、 というクラスとPuzzle、それに対応する 2 つの (関連する) コンストラクターがあります。1 つのコンストラクターは引数を受け入れず、もう 1 つのコンストラクターは int を受け取りますが、例外もスローします。基本的な考え方は次のとおりです。

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 を取るコンストラクターは例外をスローし、引数のないコンストラクターは例外を処理またはスローしないからです。しかし、例外がスローされないことは明白なので (コンストラクターの本体でスローされる例外はもうありません)、これは問題ではありません。次のように空の try-catch ステートメントを使用できます。

public Puzzle() {
    try {
        this(3);
    } catch (Exception e) {
        // Never happens
    }
}

ここでの問題は、への呼び出しがthis(3)コンストラクターの最初のステートメントではないため、コンパイルされないことです。例外がスローされないことはわかっていますが、このコンストラクターをthrows句でマークする必要があるようです。これは、コードの呼び出しに不必要な try-catch ブロックが必要になるか、例外もスローする必要があるため、非常に厄介です。私が見逃しているエレガントな方法はありますか?一部のコードを簡単にコピーして貼り付けることができることはわかっていますが、それは OOP で神聖なすべての要素に反します。何か案は?

4

2 に答える 2

6

ランタイム例外を使用します。具体的には、IllegalArgumentException はこのために設計されています。

于 2012-12-02T18:20:26.240 に答える
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
    }
}
于 2012-12-02T18:18:58.503 に答える