2015-10-05 33 views
1

這涉及到以下主題:多少次靜態方法將在Java執行

https://stackoverflow.com/questions/18402564/how-do-static-methods-work

假設我在一個類(識別TestClass),其查詢數據庫並保存它有一個靜態方法在一個靜態變量中,並返回它。

public static List<MyClass> getMyData() 
    { 
    setMyDataList(getMyNewData.execute());//DB Call and assigns the result to the static variable. 
    return myDataList;// returns the static variable 
    } 

在這種情況下,說A類要求TestClass.getMyData()其獲取在myDataList數據並存儲,然後B類要求TestClass.getMyData(),將在DB中再次襲來?

+2

每次調用某個方法時,都會調用該方法。如果將結果存儲在一個變量中並只訪問變量,那麼它將成爲每次讀取的變量。 –

回答

2

靜態塊不等於靜態方法。

In case of static block: 

這時候類加載器加載一個類的靜態塊負荷。除非您有多個類加載器,否則只能執行一次,並且插入的數據將在所有實例中共享。

Incase of static method : 

它幾乎就像一個實例方法,你可以多次打這個方法。差異只是你不需要一個實例來調用它。

你完全不需要那種方法。把你的代碼放入一個靜態塊中,並將其插入到列表中。您可以使用靜態方式訪問該列表,不要忘記製作該列表static

+1

但是,這是一種方法,我猜不是一個靜態塊。 – YoungHobbit

+1

@YoungHobbit是的。編輯了一下。感謝您指點。 –

+1

非常感謝您的幫助。這也是我的理解。但只是從其他一些來源弄糊塗了。感謝您的澄清。 –

2

是的,它會被「打」了......

如果你不想,你可能想在你的靜態類標誌表示如果該方法已經被稱爲:

private static boolean methodAlreadyCalled = false; 

public static List<MyClass> getMyData() 
{ 
    if (!methodAlreadyCalled) 
    { 
     setMyDataList(getMyNewData.execute()); 
     methodAlreadyCalled = true; 
    } 
    return myDataList; 
} 
+3

如果它被多個線程訪問,則可能需要同步。但OP沒有提到多線程,所以很好。 – YoungHobbit

+0

是的,這是真的! –