サーチ…


備考

Nullオブジェクトは、参照値を持たないオブジェクト、または定義された中立の動作を持つオブジェクトです。その目的はnullポインタ/参照チェックの必要性を取り除くことです。

ヌルオブジェクトパターン(C ++)

抽象クラスを仮定します:

class ILogger {
    virtual ~ILogger() = default;
    virtual Log(const std::string&) = 0;
};

の代わりに

void doJob(ILogger* logger) {
    if (logger) {
         logger->Log("[doJob]:Step 1");
    }
    // ...
    if (logger) {
         logger->Log("[doJob]:Step 2");
    }
    // ...
    if (logger) {
         logger->Log("[doJob]:End");
    }
}

void doJobWithoutLogging()
{
    doJob(nullptr);
}

Null Object Loggerを作成することができます:

class NullLogger : public ILogger
{
    void Log(const std::string&) override { /* Empty */ }
};

次のようにdoJobを変更します。

void doJob(ILogger& logger) {
    logger.Log("[doJob]:Step1");
    // ...
    logger.Log("[doJob]:Step 2");
    // ...
    logger.Log("[doJob]:End");
}

void doJobWithoutLogging()
{
    NullLogger logger;
    doJob(logger);
}

列挙型を使用したNullオブジェクト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オブジェクトは状態を持たないので、そのためにenumシングルトンを使用することは理にかなっています。したがって、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);
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow