gpt4 book ai didi

java - 以方法作为参数的 DRY

转载 作者:行者123 更新时间:2023-12-01 13:40:06 28 4
gpt4 key购买 nike

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

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);
}
}

我似乎无法使其通用,因为似乎没有办法传递对变量的引用,例如 void f(int *outFoo) { *outFoo = 42; } 在 C 语言中。

理想情况下,我想要这样的东西:

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 中缺乏闭包,我能想到的下一个最好的办法是“映射”必要的方法调用的接口(interface),但这往往需要输入更多的文本,而不是简单地复制这些方法。有没有优雅的方法来解决这个问题?

最佳答案

正如评论中提到的,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()));

这消除了您大部分 DRY 担忧。唯一真正的缺点是,即使没有更改, setter 也会被调用,但我希望 setter 非常轻量级,因此这不应该成为问题。

关于java - 以方法作为参数的 DRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20893524/

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