0

我有一堆像这两个这样的条目:

        if (update) {
            if (activity.getName() == null) {
                logger.debug("      Setting name on " + id);
            } else
            if (!activity.getName().equals(name)) {
                logger.debug("      Updating name on " + id);
            }
        }
        // if (!update) not logged on purpose
        activity.setName(name);

        if (update) {
            if (activity.getPlannedDuration() == null) {
                logger.debug("      Setting plannedDuration on " + id);
            } else
            if (!activity.getPlannedDuration().equals(duration)) {
                logger.debug("      Updating plannedDuration on " + id);
            }
        }
        // if (!update) not logged on purpose
        activity.setPlannedDuration(duration);

为了代码可读性的目的,我想用这样的东西替换它们:

        updateField(update, name, "name", activity.getName, activity.setName);
        updateField(update, duration, "plannedDuration", activity.getPlannedDuration, activity.setPlannedDuration);

我知道这是一个常见问题,我做了功课,将方法包装到 Callable 接口似乎是最简单的解决方案。但是,该解决方案将比我当前的代码更加混乱(请记住,我这样做是为了便于阅读)。

那么,对于我在 Java 中的问题,是否有一个优雅的解决方案?

4

1 回答 1

1

好吧,您可以将该特定代码重构为:

logUpdate(update, activity.getName(), name, "name", id);
activity.setName(name);

logUpdate(update, activity.getPlannedDuration(), plannedDuration,
          "planned duration", id);
activity.setPlannedDuration(plannedDuration);

...

static void logUpdate(boolean update, Object currentValue,
                      Object newValue, String field, String id) {
    if (currentValue == null) {
        logger.debug("      Setting " + field + " on " + id);
    } else if (!currentValue.equals(newValue)) {
        logger.debug("      Updating name on " + id);
    }    
}

这不是很棒,但它仍然是一个改进。请注意,无论您是否记录了该字段,目前您实际上都在更新该字段 - 您确定这是您的意图吗?我更期待类似的东西:

if (update) {
    logUpdate(activity.getName(), name, "name", id);
    activity.setName(name);

    logUpdate(activity.getPlannedDuration(), plannedDuration,
             "planned duration", id);
    activity.setPlannedDuration(plannedDuration);
}

但是,不,目前在 Java 中没有简单的方法来传递方法。然而,Java 8 将通过方法引用和 lambda 表达式使其变得更加简单。

于 2013-10-01T06:08:53.367 回答