到現在我已經隨處可見的步驟創建空對象模式,例如在BST去除null檢查,情況如下:方式來實現空對象模式
創建一個接口節點
創建兩個實現接口節點的類。其中之一將是real_Node,其他將爲null_Node。
使用這些類,可以在創建樹時在BST類中刪除空檢查。
現在我想知道,是否有其他方法可以做到這一點,例如, 我們能否使用在上述步驟(1)只有類,即實現無接口Null對象模式,我們可以使用節點類代替節點接口
到現在我已經隨處可見的步驟創建空對象模式,例如在BST去除null檢查,情況如下:方式來實現空對象模式
創建一個接口節點
創建兩個實現接口節點的類。其中之一將是real_Node,其他將爲null_Node。
使用這些類,可以在創建樹時在BST類中刪除空檢查。
現在我想知道,是否有其他方法可以做到這一點,例如, 我們能否使用在上述步驟(1)只有類,即實現無接口Null對象模式,我們可以使用節點類代替節點接口
是的,有些方法可以在不明確使用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對象確實是一個特殊的價值只是一種特殊情況下(這真的取決於什麼類上的操作)。在這種情況下,您可以使用具有該值的靜態成員,也可以使用靜態工廠來創建它。
*「static classes」*靜態類只是一種嵌套類,所以我不知道它與空對象模式有什麼關係。請編輯你的問題,並嘗試澄清你的問題。 – Radiodef
謝謝,我想問一下在(1.)中我們可以使用Node類而不是Node接口。 – Nazgul
Java 8+包含['Optional'](https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html)容器類型。 –