2015-05-17 76 views
-1

試圖想出一個好的策略來解決我的問題。問題是我有一個包含私有構造函數和靜態方法的最終類。爲了使用任何靜態方法,我必須初始化類的一個實例。因爲我在構造函數中有方法需要的數據才能起作用。具有靜態方法和私有構造函數的final類?

那麼,爲什麼我要使方法靜態?因爲1)項目非常大,我需要例如MyClass.AccessThis()和2)比創建實例並調用方法更容易。

編輯:我的意思是2)是如果我把我所有的方法都變成非靜態的公共構造函數,那麼我可以在任何類中創建一個類的實例並使用我的方法。

編輯2:所以在這裏。

public final class StackOverFlow { 

private static Map<String, String> map = new HashMap<String, String>(); 

    private StackOverFlow() { 

     map.put("hello", "hello"); 
    } 

    public static String getHello() { 
     return map.get("hello"); 
    } 
} 

如果我通過StackOverFlow.getHello()調用另一個類的方法,我無法明確地獲取數據;因爲數據不存在。

我想知道有沒有什麼好的方法來獲取數據而不把數據放在靜態方法中?

+2

請張貼您的代碼。 – Timo

+1

*因爲我在構造函數中有[static]方法需要的數據* - 您打算如何從* static *方法訪問該實例數據?你的問題不是很清楚,因爲它似乎基於一個不可能的前提。 –

+3

我很確定你正在做面向對象編程錯誤...:D –

回答

1

爲了使用任何的靜態方法我必須初始化類的 實例。因爲我在構造函數中有數據,因此 方法需要才能運行。

不,這是不正確的。這不是靜態方法的工作方式。

爲你寫的每類中,有兩種可能的數據結構:

  • Class對象。每個類都有一個關聯的Class對象。
  • 實例。類可以有選擇地包含實例(由類定義)

靜態方法和字段與Class對象相關聯。它們獨立於任何實例。因此,靜態成員無法訪問任何屬於實例一部分的數據。相反,任何實例都可以訪問任何屬於Class對象的靜態成員。

您可以絕對使用在您的類中定義的所有可訪問的靜態方法,而無需其初始化實例(因爲靜態成員屬於Class對象而不屬於任何實例)。

我不能明顯地獲得數據,如果我打電話從另一個 類的方法,通過StackOverFlow.getHello();

我想知道是否有任何好的方法來獲取數據,而不會將數據放入靜態方法中?

哦,是的,你可以。數據屬於Class對象,StackOverflow。任何可訪問您的StackOverflow類並可訪問其方法的對象都可以獲取您的數據,而不管它們在項目中的位置。靜態字段是一種全局數據。在你的情況下,與StackOverflow相同的.class文件中的任何方法都可以訪問你的地圖對象。

當然還有其他方法。您需要爲您的項目提供一個好的數據模型。例如,您可以將您的數據放在一個單例對象的實例中,該單例對象將您的引用傳遞給其他方法。

0

如果您創建一個靜態方法,您可以在不初始化的情況下調用它。 例如:

class MyClass { 
    public static int myMethod() { ... } 
} 

調用應該是:

int result = MyClass.myMethod(); 
0

這可能是你所期待的,靜態初始化什麼:

public final class StackOverFlow { 

    // remove the final if you have methods modifying the map 
    private static final Map<String, String> map = new HashMap<String, String>(); 
    static { 
     map.put("hello", "hello"); 
    } 

    public static String getHello() { 
     return map.get("hello"); 
    } 

} 

就像你永遠需要創建一個對象來訪問getHello()

相關問題