Vấn đề: code rải rác if (obj != null) obj.doSomething() gây rối, dễ quên, và dẫn tới NullPointerException.
Ý tưởng: thay vì trả null khi "không có gì", trả về một object triển khai cùng interface nhưng hành vi trung tính / không làm gì (do-nothing).
Ví dụ: interface Logger { log(msg) }. Thay vì để logger có thể null, dùng NullLogger với log() rỗng. Nơi gọi logger.log(...) luôn an toàn, không cần kiểm tra null.
Lợi ích: bỏ được các nhánh null-check, code sạch hơn, và định nghĩa hành vi mặc định ở một chỗ duy nhất.
Đánh đổi: chỉ hợp khi "không có gì" thực sự nên im lặng; nếu vắng giá trị là lỗi cần báo, nuốt nó bằng Null Object sẽ giấu bug. Martin Fowler xem đây là một dạng đặc biệt của "special case" object.