0

次の 2 つのようなエントリがたくさんあります。

        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 では、メソッド参照とラムダ式を使用すると、はるかに簡単になります。

于 2013-10-01T06:08:53.367 に答える