はい、Java を明示的に使用せずに Null オブジェクト パターンを実装する方法がありますinterface
。しかし、あなたは本当に同じことをしているので、YMMV. 基本クラスにアクセスできない場合、および/または何らかの形の拡張/オーバーライドが許可されていない場合、問題が発生する可能性があります。
基本クラスを拡張するが、それらをオーバーライドして「null」操作を行うクラスを作成します。通常、アクセスを容易にするために、ある種の静的コンストラクターの背後に隠します。
class Base {
public void someMethod() {
// this stuff does the non-null behaviour
}
public static Base nullVersion() {
return new NullOfBase();
}
private static class NullOfBase extends Base {
@Override
public void someMethod() {
// this guy does the null version.
}
}
}
オーバーライドする必要があるさまざまな操作をオーバーライドする、静的な 'NULL' クラス メンバーで匿名クラスを使用します。
public class Base {
public static final Base NULL = new Base() {
@Override
public void someMethod() {
// this guy does the null version.
}
}
public void someMethod() {
// this stuff does the non-null behaviour
}
}
抽象クラスを使用して、非 null 実装と null 実装の両方に共通する操作を保持し、それらのメソッドを final としてマークします。他のすべてのメソッドは抽象であり、2 つの具象クラス (1 つは非 null 機能用、もう 1 つは非 null 機能用) で実装されます。ヌル機能。静的コンストラクターを使用して、一般的なユースケースを簡単に構築し、具体的なクラス名をビューから隠しておくことができます。
public abstract class Base {
public final sayHello() {
System.out.println("Hello world");
}
public abstract void someMethod();
public static Base nonNullVersion() {
return new NonNullBase();
}
public static Base nullVersion() {
return new NullBase();
}
private static final class NonNullBase extends Base {
@Override
public void someMethod() {
// this stuff does the non-null behaviour
}
}
private static final class NullBase extends Base {
@Override
public void someMethod() {
// this stuff does the null behaviour
}
}
}
あるいは、NULL オブジェクトが実際には特定の値の特殊なケースにすぎない場合もあります (クラスの操作によって異なります)。その場合、その値を持つ静的メンバー、またはそれを作成できる静的ファクトリを持つことができます。