CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第3章 ラムダ式を使ったプログラミング : 問題 1 : 遅延ロギング

問題 1

条件的なロギングを提供することで、遅延ロギング技法を強化せよ
典型的な呼び出しは

logIf(Level.FINEST, () -> i == 10, () -> "a[10] = " + a[10])

となる。
ロガーがメッセージをロギングしないときは、その条件も評価しないようにせよ

解答

■ 遅延ロガー

public class LazyLogger {
    private final Logger logger;

    public LazyLogger(Logger logger) {
        this.logger = logger;
        setLogLevel(Level.ALL);
    }
    public void setLogLevel(Level level) {
        logger.setLevel(level);
    }
    public void logIf(Level level, BooleanSupplier condition, Supplier<String> message) {
        if (logger.isLoggable(level)) {
            if (condition.getAsBoolean()) {
                logger.log(level, message.get());
            }
        }
    }
}

おまけ

ログ出力は、もっぱら Log4J か SLF4J で Javajava.util.logging.Loggerは全く使ったことない。
このロガーは Java 8 になってラムダ式に対応した。

void log(Level level, Supplier<String> msgSupplier)

メッセージは遅延実行できるが、出力条件の遅延実行まではサポートされていない。

ん~~、良くなったと思うが、変数がfinalに制限されるんじゃ乗り換える気にはならないな。