2013-01-22 24 views
0

我有一個包含許多未知源的接口實現的應用程序。我想清理我的源代碼,以便我不需要編寫:如何包裝來自未知源的對象

A a = AFactory.getImpl(); 
B b = a.getB(); 
if(b == null) return; 
b.doSomething(); 

這會變得非常漫長。我是否應該包裝這個對象,以便A永不會從getB()返回null;如果這是一個好主意,我該怎麼做,我應該提供一個實現,如InvalidImplemetationException,並強制它被捕獲的錯誤。

+0

一切似乎我的權利:請永遠不會返回確保空,如果遇到空拋出異常。你是否應該強制這個異常被捕獲 - 也就是說它是否應該是一個檢查過的異常 - 取決於是否可以在適當的運行時配置中返回null,以及應用程序是否可以實際上對日誌和/或退出進行操作。 – VGR

回答

1

你應該考慮使用空對象模式:定義一個值B,它封裝了當你沒有B時所需的行爲。在這種情況下,這意味着doSomething()什麼都不做。

B應該是這樣的:

public class B { 
    public static final B NULL = new B() { 
     public void doSomething() { 
     } 
    }; 

    public static B fromA(A a) { 
     B b = a.getB(); 
     return b == null ? NULL : b; 
    } 

    public void doSomething() { 
     ... 
    } 
} 

你會使用這樣的:

A a = AFactory.getImpl(); 
B.fromA(a).doSomething(); 

如果你可以改變AFactory.getImpl,使其返回B.NULL,而不是null。然後,你不需要B.fromA,你可以這樣做,而不是:你認爲

A a = AFactory.getImpl(); 
a.getB().doSomething(); 
0

在這種情況下,我會建議你把b == null代碼放在getB函數中。

看起來你確實做了一些研究,並選擇了一個很好的例外。

一個好的選擇是不拋出異常返回B的新對象。