使用列舉的空物件 Java

給定一個介面:

public interface Logger {
   void log(String message);
}

而不是用法:

public void doJob(Logger logger) {
    if (logger != null) {
       logger.log("[doJob]:Step 1");
    }
    // ...
    if (logger != null) {
       logger.log("[doJob]:Step 2");
    }
    // ...
    if (logger != null) {
       logger.log("[doJob]:Step 3");
    }
}

public void doJob() {
    doJob(null); // Without Logging
}

因為 null 物件沒有狀態,所以對它使用列舉單例是有意義的,所以給定一個像這樣實現的 null 物件:

public enum NullLogger implements Logger {
    INSTANCE;

    @Override
    public void log(String message) {
        // Do nothing
    }
}

然後,你可以避免空檢查。

public void doJob(Logger logger) {
    logger.log("[doJob]:Step 1");
    // ...
    logger.log("[doJob]:Step 2");
    // ...
    logger.log("[doJob]:Step 3");
}

public void doJob() {
    doJob(NullLogger.INSTANCE);
}