2

これまで、たとえば BST で null チェックを削除するなど、Null オブジェクト パターンを作成する手順は次のとおりであることをどこでも見てきました。

  1. インターフェイス ノードを作成する

  2. インターフェイス Node を実装する 2 つのクラスを作成します。1 つは real_Node になり、もう 1 つは null_Node になります。

  3. これらのクラスを使用すると、ツリーの作成中に BST クラスで null チェックを削除できます。

ここで、これを行う他の方法があるかどうかを知りたいです。たとえば、クラスのみを使用して、インターフェイスなしで Null オブジェクト パターンを実装できますか。つまり、上記の手順 (1.) で Node インターフェイスの代わりに Node クラスを使用できますか?

4

1 に答える 1

3

はい、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 オブジェクトが実際には特定の値の特殊なケースにすぎない場合もあります (クラスの操作によって異なります)。その場合、その値を持つ静的メンバー、またはそれを作成できる静的ファクトリを持つことができます。

于 2016-02-29T00:12:54.687 に答える