수색…


비고

Null 개체는 참조 된 값이 없거나 정의 된 중립적 인 동작을 가진 개체입니다. 그 목적은 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);
}

enum을 사용하여 Null Object 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
    }
}

그런 다음 null 확인을 피할 수 있습니다.

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