2013-01-31 76 views
0

我只是想知道什麼是最好的解決辦法是(類框架只能出現一次,它擁有的配置等)靜態類或實例作爲參數?

讓我們假設下(靜態):

public class Framework { 
    private Framework() {} 

    private static String something; 
    private static Object somethingElse; 

    public static synchronized void init() { 
     something = "something"; 
     somethingElse = new SuperFancyObject(); 
    } 

    public static String getSomething() { return something; } 
    public static Object getSomethingElse() { return somethingElse; } 
} 

現在我可以使用這個類中的所有方法調用的任何地方:

public void invoke(Request request, Response response) { 
    ... 
    Framework.getSomething(); 
    ... 
} 

其他的解決辦法是:

public class Framework { 
    private static String something; 
    private static Object somethingElse; 

    public Framework() { 
     something = "something"; 
     somethingElse = new SuperFancyObject(); 
    } 

    public String getSomething() { return something; } 
    public Object getSomethingElse() { return somethingElse; } 
} 

所以,現在,使用的是,我必須通過對象/類作爲參數:

public void invoke(Framework framework, Request request, Response response) { 
    ... 
    framework.getSomething(); 
    ... 
} 

的第三個可能的解決辦法是靜態+單。

我現在想知道的是,哪個更好,更乾淨(也許性感)的解決方案還是你更喜歡的?

謝謝!

+0

性感?真的嗎? – TheWhiteRabbit

+0

檢查你的第一個電話代碼。我假設,你想調用Framework類的getSomething(),所以你不必傳遞框架參數?你什麼時候調用init()? –

+0

對不起...複製並粘貼失敗 – Constantin

回答

2

在許多情況下,一個單例優於靜態類,因爲基本上,單例是可替換,因此更容易進行總體測試。

Martin Fowler的寫了一些事情:

http://martinfowler.com/bliki/StaticSubstitution.html

+0

@downvoter:一些闡述將是最受歡迎的? – Peter

+0

憤怒downvoter :-) –

0

轉到什麼是更具可讀性。例如,如果您說Framework可以存在一次,那麼您需要將Framework設置爲一個單例。這直接表達了你的程序/對象應該做什麼。

不要想到性感,想到溝通。例如,如果我用15世紀英語與你交談,你會很生氣。你會不會被剷除?

+0

憤怒downvoter :-D –

0

你可以改變你的類:

public class Framework { 

    private String something; 

    /** Singleton instance */ 
    private static Framework iSingleton = new Framework();  // SINGLETON 

    protected Framework(){ 
      //init 
    } 

    public static String getSomething() { 
     return iSingleton.something; 
    } 
} 

在你的invoke方法,我不需要框架實例。 您可以致電此:

public void invoke(Framework framework, Request request, Response response) { 

    Framework.getSomething(); //Call static method. 
} 
+0

抱歉購買爲什麼-1? –

+0

Angry Downvoter lol –

+0

簡單的單身人士,就像我在帖子中所說的第三種解決方案。我會把它寫成LazySingleton,所以只有在需要的時候纔會創建類 – Constantin

-1

如果有狀態,確保不使用,而不是從靜態訪問。

+0

憤怒的downvoter –

+0

@Aniket太對了,我很生氣。 –