我最后在几个类中使用了几个方法,这些方法遵循相同的模式(每个类中总是有很多方法):
private void updateFoo() {
String newFoo = fooTextField.getText();
if (!newFoo.equals(record.getFoo())) {
// "record" stays the same for all methods of this pattern.
record.setFoo(newFoo);
record = DATABASE.save(record);
}
}
我似乎无法将其设为通用,因为似乎没有办法将引用传递给变量,例如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);
}
}
所以最后我可以做一些像(伪代码)的事情:
update(fooTextField, &record.getFoo, &record.setFoo);
鉴于Java中缺少闭包,我能想到的下一个最好的事情是“映射”必要的方法调用的接口,但这往往需要更多的文本来键入而不是简单地复制这些方法。有没有一种优雅的方法来解决这个问题?
答案 0 :(得分:1)
正如评论中所提到的,Java 8中的闭包将在这里提供帮助。
使用当前Java可以完成的任务是传入方法名称的String对象,使用反射来调用方法然后返回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非常轻巧,但这应该不是问题。