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

第二个版本是邪恶的,因为它使用异常进行流控制。阅读Joshua Bloch的 Effective Java,了解为什么它不好(第 57 条:“仅在异常情况下使用异常”)。

于 2012-06-11T15:58:44.343 回答
0

答案可能是这样的:捕获 aClassCastException允许e成为 的任何子类JCheckBox,而使用 instanceof 将其仅限制为 a JCheckBox

于 2012-06-11T16:02:04.163 回答