在Java中使用监听器的这两种方法之间是否存在性能/负载差异



在使用侦听器时,我总是看到这样的代码。

@SuppressWarnings("serial")
public class Test extends JPanel{
public Test() {
JPanel a = new JPanel();
a.add(checkBoxMaker("foo"));
add(a);
}
public JCheckBox checkBoxMaker(String name){
JCheckBox b = new JCheckBox(name);
// Like this (better)
b.addItemListener(e -> System.out.println(e.getStateChange()));
// Or like this
b.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println(e.getStateChange());
}
});
return b;
}
}

我认为更好的方式是这样的:

@SuppressWarnings("serial")
public class Test extends JPanel{
private ItemListener listener;
public Test() {
// So 
listener = e -> System.out.println(e.getStateChange());
// or so
listener = new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println(e.getStateChange());
}
};
JPanel a = new JPanel();
a.add(checkBoxMaker("foo"));
add(a);
}
public JCheckBox checkBoxMaker(String name){
JCheckBox b = new JCheckBox(name);
b.addItemListener(listener); //same listener declared once above
return b;
}
}

在第一个片段中,您可以看到每个Checkbox创建都会创建一个带有新关键字的ItemListener实例,我想这很慢,而且会耗费ram。而我的版本只声明了一次Itemlistener,并在创建复选框时使用它。

我认为实例化一件事总是比连续做几次要好。

所以我的问题是:我的思维方式和与听众合作的方式在任何方面都更好吗?

额外的问题:GUI应用程序中的边框是什么?声明Border并在UI上多次使用它是否比每次使用BorderFactory为每个JComponent创建Border更有效?

关于

您的方法避免了创建额外的侦听器对象,这是正确的。

但是,除非你的复选框数量真的很疯狂,否则这根本无关紧要。Java程序分配成千上万的对象。或多或少的几个并不是任何人都会注意到的。

这种方法的缺点是,只有当所有侦听器都完全相同时,它才有效。通常,你会希望听众做一些特定于该控件的事情。在复选框控件的情况下,您可能希望它在其他对象上设置特定的标志。所以现在侦听器不同了:Foo复选框侦听器调用Something.setFoo,Baz侦听器调用Something.setBaz。或者,听众只是不同,因为他们从上下文中获取了不同的值。

相关内容

最新更新