1

到現在我已經隨處可見的步驟創建空對象模式,例如在BST去除null檢查,情況如下:方式來實現空對象模式

  1. 創建一個接口節點

  2. 創建兩個實現接口節點的類。其中之一將是real_Node,其他將爲null_Node。

  3. 使用這些類,可以在創建樹時在BST類中刪除空檢查。

現在我想知道,是否有其他方法可以做到這一點,例如, 我們能否使用在上述步驟(1)只有類,即實現無接口Null對象模式,我們可以使用節點類代替節點接口

+0

*「static classes」*靜態類只是一種嵌套類,所以我不知道它與空對象模式有什麼關係。請編輯你的問題,並嘗試澄清你的問題。 – Radiodef

+0

謝謝,我想問一下在(1.)中我們可以使用Node類而不是Node接口。 – Nazgul

+2

Java 8+包含['Optional'](https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html)容器類型。 –

回答

2

是的,有些方法可以在不明確使用Java interface的情況下實現Null對象模式。但是,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 
        } 
    } 
    
  • 使用抽象類來保存這是常見的兩種非空和空實現運營,這標誌着這些方法的決賽,其他所有方法都是抽象的,並在兩個具體的類實現 - 對一個非空功能,另一個用於空功能。您可以使用靜態構造函數來保持常見用例易於構造,並且隱藏視圖中的具體類名。

    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對象確實是一個特殊的價值只是一種特殊情況下(這真的取決於什麼類上的操作)。在這種情況下,您可以使用具有該值的靜態成員,也可以使用靜態工廠來創建它。