从接口的方法中排除类的最有效方法

时间:2012-06-11 15:55:59

标签: java

到目前为止,我已使用以下代码将某些方法的应用程序限制为某些类的实例。例如,使用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;
        }

    }
}

哪种方法可以锁定您不希望应用方法的类?实现接口时尤其如此,其中参数无法更改。

3 个答案:

答案 0 :(得分:6)

在这两种情况下,这都是编程错误。听众被不适当地添加。对此的正确回答几乎肯定不仅仅是打印出可能永远不会被看到的消息 - 这是一个例外。

简单的投射会在没有任何工作的情况下为您提供该异常,因此只需无条件投射,并且不要试图掩盖编程错误。

答案 1 :(得分:3)

第二个版本是邪恶的,因为它使用流量控制的异常。阅读Effective Java by Joshua Bloch以了解为什么这是不好的(第57项:“仅在特殊条件下使用例外”)。

答案 2 :(得分:0)

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