2015-10-15 22 views
-1

我正在研究一個項目,我們將實際的類實現保存在接口的靜態字段中。這方面的一個例子是:將類實現保存在其接口的靜態字段中是不是一個好主意?

public interface Storage { 

    public static Storage instance = new DiskStorage(); 

    public File get(String name) throws Exception; 

    public void create(File f) throws Exception; 

    public void delete(File f) throws Exception; 

} 

我們這樣做是繼續避免使用IoC框架的複雜性,並避免亂拋垃圾我們的代碼與像context.getImpl(Storage.class)電話。此外,我們還嘗試避免引入大型工廠類,我們相信我們可以通過在接口的靜態字段中保留實現參考來做到這一點。我們通過這種方式實現的是,需要存儲某些內容的應用程序的任何部分都可以通過Storage.instance.create(File f)來完成。

但是,我們一直在討論這是否違背了廣泛接受的「原則」。首先;我們是否遇到了在接口中創建實現依賴關係的麻煩?嚴格地說,接口現在對實現有直接的「參考」。其次,我們意識到我們的測試不能只是將「MemoryDiskStorage」或「MockDiskStorage」作爲接口中的靜態字段「注入」最終字段。我們如何解決這個問題?

+5

「public static」不是必須的,因爲接口中的字段自動爲public static final,方法爲public abstract。 –

+1

這個問題可能更適合http://codereview.stackexchange.com/ –

回答

1

對我來說,你已經回答了你自己的問題:是的,這是一個壞主意,因爲通過解決IoC的複雜性,你已經打破了IoC,並且無法模擬測試中的存儲實現。對於那些context.getImpl(Storage.class)調用,有一個原因

1

它使您無法將您的界面與實施分離。

例如,在一個ModuleA更復雜的應用取決於ModuleB,你可能想在ModuleB分離服務的接口爲ModuleBInterface使ModuleA只取決於ModuleBInterface。你的方法使得這是不可能的,因爲接口依賴於實現以及實現取決於它的接口。

相關問題