第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 で Java のjava.util.logging.Logger
は全く使ったことない。
このロガーは Java 8 になってラムダ式に対応した。
void log(Level level, Supplier<String> msgSupplier)
メッセージは遅延実行できるが、出力条件の遅延実行まではサポートされていない。
ん~~、良くなったと思うが、変数がfinal
に制限されるんじゃ乗り換える気にはならないな。