【问题标题】:Why does an action listener gives different result when using method reference? [duplicate]为什么在使用方法引用时动作监听器会给出不同的结果? [复制]
【发布时间】:2019-07-03 11:42:33
【问题描述】:

今天,我遇到了一个奇怪的(对我来说)行为,我检查了它。我确实阅读了一堆关于方法引用和 lambda 之间区别的主题,但我无法将它与我的示例联系起来。考虑以下类:

public class TestFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    private JComboBox<String> comboBox;

    public TestFrame() {
        super("test");
        setLayout(new FlowLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        comboBox = new JComboBox<>(new String[] { "hello", "world", "hi", "stack", "overflow" });
        comboBox.addActionListener(event -> {
            new ChangedIndexEvent(comboBox.getSelectedIndex()).printSelectedIndex(event);
        });
        add(comboBox);
        setLocationRelativeTo(null);
        setSize(200, 200);
        setVisible(true);
    }

    private class ChangedIndexEvent {
        private int index;

        public ChangedIndexEvent(int index) {
            this.index = index;
        }

        private void printSelectedIndex(ActionEvent event) {
            System.out.println("Index: " + index);
        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TestFrame::new);
    }

}

当您运行它并使用组合框进行一些操作时,您将获得“正常”输出,例如:

索引:3 索引:1 索引:4 索引:0

但是,如果我改变了使用方法引用添加侦听器的方式:

comboBox.addActionListener(new ChangedIndexEvent(comboBox.getSelectedIndex())::printSelectedIndex);

输出将是:

索引:0 索引:0 索引:0

我的问题是,为什么总是 0?

我的意思是,如果我 comboBox.setSelectedIndex(2); 它总是会返回 2 我猜它会返回“初始”值。但是方法引用不是和 lambda 表达式一样吗?

【问题讨论】:

    标签: java swing lambda method-reference


    【解决方案1】:

    方法引用是对单个方法的引用。如果(如您的情况)它是对特定实例的实例方法的引用,它将始终为同一个实例执行。

    因此,new ChangedIndexEvent(comboBox.getSelectedIndex()) 被评估一次以创建其方法被new ChangedIndexEvent(comboBox.getSelectedIndex())::printSelectedIndex 引用的实例。

    因此,当您使用该方法引用时,选定的索引永远不会改变。

    另一方面,当您使用 lambda 表达式 event -&gt; {new ChangedIndexEvent(comboBox.getSelectedIndex()).printSelectedIndex(event);} 时,每次执行此表达式实现的方法时,它都会创建一个新的 ChangedIndexEvent 实例,具有不同的选定索引。

    【讨论】:

    • 不过,谢谢。你的回答涵盖了我,我会尽快接受(时间限制)。
    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 2014-06-11
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2021-08-26
    相关资源
    最近更新 更多