将块传递给Java中的方法
我有一个在swing应用程序中的几个不同点上使用的GUI元素。当按下“确定”按钮时,我需要在每个实例中运行不同的代码。将块传递给Java中的方法
我已经通过在每种情况下传递一个动作侦听器来解决这个问题,但是随着我继续这变得混乱。在Ruby中尽可能将块传递给方法。我想知道Java中是否存在类似但干净的东西。
凌乱代码: 主要是由于需要调用GUI对象元素的方法。如果我在构造函数中传递ActionListener,则该对象尚不存在。我可以在每种情况下调用第二种方法,但不是优选的。
我已经使用的解决方案并没有真正解决问题的标题,但完全满足了我的需求。因为:
- 在我的情况下,它总是被解析的功能(即,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();
}
});
您有正确的想法。将任意代码块传递给方法的通常解决方案是Command pattern。如果您可以显示您现在具有的“杂乱”代码示例,则可以帮助您清理它。
更新回复:乱码
如果我通过了ActionListener的构造函数中的对象还不存在。
一个实际的代码示例将有助于提供良好的响应。有人猜测,我想说,也许你想看看Factory pattern?在这种情况下,我更多地考虑封装优势,而不是多态优势。再次,只是猜测。看到代码有帮助。
Java不支持作为一流公民的代码块(或功能)的想法。这就是事件通过实现特定接口的类来完成的原因。你似乎已经做了类似的事情,所以也许你只需要创建自己的接口来支持你想要支持的特定事件。
通过ActionListener
实现可能是您现在可以做的最好的。
Java 8将提供对“闭包”的支持,这将大大简化使用单个单参数方法实现接口的过程。但是,对于Java 7几乎没有出现,对于Java 8来说这将是几年。
我不怀疑你是正确的估计,但最后我听说他们还在2012年底拍摄的Java 8。官方估计是否改变了? – 2011-03-29 18:10:23
@Mark Peters - 不,我认为这仍然是官方估计。 – erickson 2011-03-29 18:40:12