当前位置: 代码迷 >> java >> 将块传递给Java中的方法
  详细解决方案

将块传递给Java中的方法

热度:85   发布时间:2023-08-02 10:57:39.0

我有一个GUI元素,用于swing应用程序中的几个不同点。 按下“确定”按钮后,我需要在每个实例中运行不同的代码。

我通过在每种情况下传递一个动作监听器来解决这个问题,但是当我继续这样做时会变得混乱。 最好将块传递给Ruby中的方法。 我想知道Java中是否存在类似但干净的东西。

凌乱的代码:主要是由于需要在GUI对象的元素上调用方法。 如果我在构造函数中传递ActionListener,则该对象尚不存在。 我可以在每个实例中调用第二种方法,但这不是优选的。

你已经有了正确的想法。 将任意代码块传递给方法的常用解决方案是 。 如果您可以显示现在的“杂乱”代码示例,则可以帮助您清理它。

更新Re:凌乱的代码

如果我在构造函数中传递ActionListener,则该对象尚不存在。

实际的代码示例将有助于提供良好的响应。 猜测一下,我想也许你想看看 ? 在这种情况下,我更多地考虑封装的好处而不是多态的好处。 再一次,只是猜测。 看代码有帮助。

传递ActionListener实现可能是您现在可以做的最好的。

Java 8将提供对“闭包”的支持,这将通过单个单参数方法极大地简化接口的实现。 但是,由于Java 7几乎不会出现,Java 8将需要几年时间。

Java不支持将代码块(或函数)作为一等公民的想法。 这就是为什么事件是通过实现特定接口的类完成的。 你似乎已经做了类似的事情,所以也许你只需要创建自己的界面来支持你想要支持的特定事件。

我所采用的解决方案并没有真正正确地解决问题的标题,而是完全符合我的需求。 因为:

  • 在我的情况下,它始终是被解析的相同功能(即onConfirm功能),并且在每个实例中都需要此功能。
  • 每个需要独特功能的实例都不适合工厂模式。

我把我的GUI元素抽象化了:

abstract class Element extends JPanel {

    ...
    private final JButton button = new JButton("OK");

    protected abstract void onConfirm();

    public Element(){
        this.button.addActionListener(new ActionListener(){
            @Override public void actionPerformed(ActionEvent e) {
                onConfirm();
            }
        });
        ...
    }
}

有几个匿名内部类实现,每个实现允许我访问GUI元素的内部。

this.getContentPane().add(new Element(){
    @Override public void onConfirm() {
        doStuffWithCommand();
    }
});
  相关解决方案