Java 使用方法作为参数

Java 使用方法作为参数,java,dry,Java,Dry,最后,我在几个类中得到了几个方法,它们遵循相同的模式(每个类中总是有一堆这样的方法): 我似乎无法将此作为泛型,因为似乎没有一种方法可以传递对变量的引用,例如C中的void f(int*outFoo){*outFoo=42;} 理想情况下,我想要的是: private void update(JTextField textField, ? getter, ? setter) { String newFoo = textField.getText(); if (!newFoo.eq

最后,我在几个类中得到了几个方法,它们遵循相同的模式(每个类中总是有一堆这样的方法):

我似乎无法将此作为泛型,因为似乎没有一种方法可以传递对变量的引用,例如C中的
void f(int*outFoo){*outFoo=42;}

理想情况下,我想要的是:

private void update(JTextField textField, ? getter, ? setter) {
    String newFoo = textField.getText();
    if (!newFoo.equals(getter())) {
        // "record" stays the same for all methods of this pattern.
        setter(newFoo);
        record = DATABASE.save(record);
    }
}
最后,我可以做一些类似(伪代码)的事情:


考虑到Java中缺少闭包,我能想到的下一个最好的方法是“映射”必要的方法调用的接口,但这比简单地复制这些方法更需要更多的文本来输入。有没有一种优雅的方法可以解决这个问题?

如Java 8中的闭包注释所述,在这里会有所帮助

当前Java可以做的事情是为方法名传入字符串对象,使用反射调用方法,然后返回newFoo。但是有一种更好的方法,它不涉及泛型和反射:

String update(JTextField textField, String oldFoo) {
    String newFoo = textField.getText();
    if (!newFoo.equals(oldFoo)) {
        record = DATABASE.save(record);
    }
    return newFoo;
}
然后,每次使用代码时,它都会变成:

setter(update(textField, getter()));
例如:

setName(update(textFieldName, getName()));

这已经消除了你大部分的忧虑。唯一真正的缺点是,即使没有任何更改也会调用setter,我希望setter非常轻量级,因此这不应该是一个问题。

您可以使用类似Functions@AntonBessonov:如果我错了,请纠正我,但这些只是函数对象。在我写的时候,我最终会用这些方法编写更多的文本,而不是复制我的短方法。即使在Java8中,也只有语法糖;在客户端,您仍然会收到一个带有单一方法(SMI)的接口。基本问题如您所说,在调用
save
之前必须调用Java setter,因此这不起作用,但idea本身是有用的。谢谢,啊。在这种情况下,您需要将save代码移动到setter中,但最终每个setter中都会出现锅炉板,因此无论您做什么,事情都会变得一团糟。
setter(update(textField, getter()));
setName(update(textFieldName, getName()));