1

これまで、次のコードを使用して、一部のメソッドの適用を特定のクラスのインスタンスに制限してきました。たとえば、を使用しますItemListenerが、これは多くのことに適用できます。

public class mListener implements ItemListener {
    public void itemStateChanged(ItemEvent e) {

        if (!(e.getItemSelectable instanceof JCheckBox)) { //again, JCheckBox was chosen arbirtarily
            System.err.println("mListener can only be applied to a JCheckBox");
            return;
        }

    }
}

ただし、Oracle Javaチュートリアルのいくつかの場所で、次のコードを見ました。

public class mListener implements ItemListener {
    public void itemStateChanged(ItemEvent e) {
        JCheckBox box = null;

        try {
            box = (JCheckBox) e.getItemSelectable();
        } catch (ClassCastException ex) {
            System.err.println("mListener can only be applied to a JCheckBox");
            return;
        }

    }
}

メソッドを適用したくないクラスをロックアウトするための最良の方法はどれですか?これは特に、パラメータを変更できない実装インターフェイスの場合に当てはまります。

4

3 に答える 3

6

どちらの場合も、これはプログラミングエラーです。リスナーが不適切に追加されています。これに対する正しい応答は、ほぼ確実に、おそらく決して表示されないメッセージを出力するだけではありません。これは例外です。

キャストするだけで、作業をしなくてもその例外が発生するため、無条件にキャストするだけで、プログラミングエラーを隠そうとしないでください。

于 2012-06-11T15:59:25.077 に答える
3

2番目のバージョンは、フロー制御に例外を使用するため、悪です。JoshuaBlochによるEffectiveJavaを読んで、それがなぜ悪いのかを学びましょう(項目57:「例外条件にのみ例外を使用する」)。

于 2012-06-11T15:58:44.343 に答える
0

答えは次のようになります。aをキャッチすると、の任意のサブクラスになることがClassCastExceptionできますが、instanceofを使用すると、それは。にのみ制限されます。eJCheckBoxJCheckBox

于 2012-06-11T16:02:04.163 に答える