我有很多这样的条目:
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);
我知道这是一个常见的问题,我完成了我的作业,wraping methods to Callable interface似乎是最简单的解决方案。但是,这个解决方案比我当前的代码更糟糕(记住,我这样做是为了提高可读性)。
那么,我的Java问题有一个优雅的解决方案吗?
答案 0 :(得分: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表达式更加简单。