gpt4 book ai didi

java - 为什么使用方法引用时操作监听器会给出不同的结果?

转载 作者:行者123 更新时间:2023-12-02 09:43:24 25 4
gpt4 key购买 nike

今天,我遇到了一个奇怪的(对我来说)行为,我检查了它。我确实阅读了很多有关方法引用和 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);
}

}

当您运行它并使用组合框时,您将得到一个“正常”输出,例如:

Index: 3 Index: 1 Index: 4 Index: 0

但是如果我更改使用方法引用添加监听器的方式:

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

输出将是:

Index: 0 Index: 0 Index: 0

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

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

最佳答案

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

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

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

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

关于java - 为什么使用方法引用时操作监听器会给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56869340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com