我是新來的java,我想知道是否可以從靜態方法返回一個對象? 由於靜態方法在類上運行......我在這裏有點困惑。 另外如果多個線程試圖調用這個呢?Java靜態方法
class Test
{
public static test(List<String> input) {
List<List<String>> res = new ... ;
// some code
return res;
}
}
我是新來的java,我想知道是否可以從靜態方法返回一個對象? 由於靜態方法在類上運行......我在這裏有點困惑。 另外如果多個線程試圖調用這個呢?Java靜態方法
class Test
{
public static test(List<String> input) {
List<List<String>> res = new ... ;
// some code
return res;
}
}
從靜態方法返回對象沒有問題。
您的示例也適用於多線程。每個線程將在堆上創建一個不同的對象並返回對它的引用 - 因此沒有問題,對象不會共享。
靜態方法不能對類進行操作。他們只是上課而不是上課的成員。這意味着他們無法訪問該類的任何非靜態成員。除此之外,它們與非靜態方法並無太大區別。
如果你的靜態方法訪問(寫或讀)一個靜態成員,那麼它可能會有多個線程的問題,除非你使用鎖定。
不,線程有自己的私有堆棧,其中的對象將被存儲,而不是堆空間,因爲線程共享它。 –
所有對象都在堆上,男人:)只有參考在堆棧上 –
可以參考http://stackoverflow.com/q/3318750/366964,這篇文章有幾個示例說明 –
靜態方法與類相關聯的,如果你從不同的線程中調用它不會有你的演示代碼的任何問題,因爲res
將線程本地
這裏同時宣佈方法,你需要編寫方法的返回類型。
例如:
import java.util.List;
class Test
{
public static List test(List<String> input) {
List<List<String>> res = new ... ;
// some code
return res;
}
}
所以,此方法將返回列表和靜態方法,你不需要創建該類的對象
學習編輯你的文章,請! :) –
這是正常的,基本上,只要你是僅使用局部變量。因此,您的代碼示例中,每次調用該方法時都會創建一個新的List
。這是否是一個優雅的設計是一個不同的故事。
如果您使用狀態,例如一些會員字段,這是一個不同的故事。多個線程可能會調用您的方法,並且它們在相同的對象上工作。
靜態方法只能訪問靜態對象。
所以,如果你將在你的靜態方法中使用任何對象,它也將是靜態的,因此對所有線程都具有相同的值。
所以你可以很容易地做到這一點。
我同意,該方法是非常好的。
雖然要小心,但該方法可能是線程安全的,但傳入的List不是。如果(例如)迭代列表,而另一個線程插入字符串,則可能會遇到一些問題。當然,字符串不可變是線程安全的。
要了解靜態變量/方法與實例變量/方法的基本知識,請閱讀this tutorial或搜索類似的內容。另外,this question及其答案應該能夠幫助解釋何時線程安全的方法(您的程序沒有修改任何可以在線程之間共享的數據,所以它非常安全)。
至於你的代碼,你的方法簽名應該是這個樣子:
public static List<List<String>> test(List<String> input) {...}
,因爲你會返回一個字符串列表的列表。
謝謝大家的回覆。 –
上面的代碼不會編譯,因爲方法聲明中缺少返回類型。 – Jesper