首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Java中,这两种使用侦听器的方式在性能/负载方面有区别吗?

在Java中,这两种使用侦听器的方式在性能/负载方面有区别吗?
EN

Stack Overflow用户
提问于 2021-03-17 20:29:54
回答 1查看 49关注 0票数 0

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

代码语言:javascript
运行
AI代码解释
复制
@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;
    }
}

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

代码语言:javascript
运行
AI代码解释
复制
@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创建都会创建一个带有new关键字的ItemListener实例,我猜这会很慢,并且会占用内存。而我的版本声明了一次Itemlistener,并在创建复选框时使用它。

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

所以我的问题是:我的思考方式和与听众合作的方式有没有更好的地方?

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

问候

EN

回答 1

Stack Overflow用户

发布于 2021-03-17 22:29:00

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

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

你的方法的缺点是,只有当所有的监听器都是相同的时,它才能起作用。通常,您会希望侦听器执行特定于该控件的操作。在使用checkbox控件的情况下,您可能希望它在其他对象上设置特定的标志。所以现在的监听器不同了: Foo复选框监听器调用Something.setFoo,Baz复选框监听器调用Something.setBaz。或者,也许监听器只是不同,因为它们从上下文中捕获了不同的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66680777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档