使用方法作为参数进行干燥

时间:2014-01-02 22:59:35

标签: java dry

我最后在几个类中使用了几个方法,这些方法遵循相同的模式(每个类中总是有很多方法):

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

1 个答案:

答案 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非常轻巧,但这应该不是问题。