2

好的,我的问题如下:假设您有一个像下面这样的课程。在运行时:
每次循环运行时都会创建一个新的动作监听器吗?
第二类比第一类效率高得多吗?
在第一堂课中是否创建了 100 个新的 ActionListener 对象?

public class Foo extends JFrame {
    public Foo() {
        for (int i = 0; i < 100; i++) {
            JTextField someField = new JTextField();
            someField.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //DO SOMETHING HERE
                }
            });
        }
    }
}

与类似的类:

public class Foo extends JFrame {
    public Foo() {
        ActionListener someActionListener = new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                //DO SOMETHING HERE
            }
        }; 
        for (int i = 0; i < 100; i++) {
            JTextField someField = new JTextField();
            someField.addActionListener(someActionListener);
        }
    }
}
4

3 回答 3

4

第二个示例可以节省 1-2 KB(价值约 0.003 美分),但鉴于功能不一样,正确性更为重要。

相比之下,你在最低工资上的 1 秒时间值 0.2 美分,所以如果你花一秒钟的时间思考它,那可能就是浪费时间。;)

于 2012-08-09T18:42:57.673 回答
2

在第一个程序中,您运行了new ActionListener()100 次。您最终将得到 100 个ActionListener对象。

在第二个程序中,您只运行new ActionListener()一次。所以你最终只会得到 1 个ActionListener对象。

显然,在第一个程序中,您占用了更多内存。但是这些程序并不等价,因为在第一个中,每个JTextField都有自己的ActionListener,而在第二个中,它们都共享一个。

于 2012-08-09T18:44:22.170 回答
1

每次循环运行时都会创建一个新的动作监听器吗?

在第一堂课,是的。

第二类比第一类效率高得多吗?

第二个类为每个新JTextField()对象提供相同的动作侦听器。这更有效(节省一些内存)。但是,您应该知道所有 100 个JTextField()对象都有相同的动作侦听器

此外,如果您要遇到这种情况,您应该someActionListener = new ActionListener()进入Foo

于 2012-08-09T18:42:10.873 回答