2011-11-24 163 views
2

我是新來的java,我想知道是否可以從靜態方法返回一個對象? 由於靜態方法在類上運行......我在這裏有點困惑。 另外如果多個線程試圖調用這個呢?Java靜態方法

class Test 
{ 
    public static test(List<String> input) { 
     List<List<String>> res = new ... ; 
     // some code 
     return res; 
    } 
} 
+0

謝謝大家的回覆。 –

+0

上面的代碼不會編譯,因爲方法聲明中缺少返回類型。 – Jesper

回答

4

從靜態方法返回對象沒有問題。

您的示例也適用於多線程。每個線程將在堆上創建一個不同的對象並返回對它的引用 - 因此沒有問題,對象不會共享。

靜態方法不能對類進行操作。他們只是上課而不是上課的成員。這意味着他們無法訪問該類的任何非靜態成員。除此之外,它們與非靜態方法並無太大區別。

如果你的靜態方法訪問(寫或讀)一個靜態成員,那麼它可能會有多個線程的問題,除非你使用鎖定。

+0

不,線程有自己的私有堆棧,其中的對象將被存儲,而不是堆空間,因爲線程共享它。 –

+0

所有對象都在堆上,男人:)只有參考在堆棧上 –

+0

可以參考http://stackoverflow.com/q/3318750/366964,這篇文章有幾個示例說明 –

2

靜態方法與類相關聯的,如果你從不同的線程中調用它不會有你的演示代碼的任何問題,因爲res將線程本地

2

這裏同時宣佈方法,你需要編寫方法的返回類型。

例如:

import java.util.List; 

    class Test 
    { 
     public static List test(List<String> input) { 
      List<List<String>> res = new ... ; 
      // some code 
      return res; 
     } 
    } 

所以,此方法將返回列表和靜態方法,你不需要創建該類的對象

+0

學習編輯你的文章,請! :) –

1

這是正常的,基本上,只要你是僅使用局部變量。因此,您的代碼示例中,每次調用該方法時都會創建一個新的List。這是否是一個優雅的設計是一個不同的故事。

如果您使用狀態,例如一些會員字段,這是一個不同的故事。多個線程可能會調用您的方法,並且它們在相同的對象上工作。

1

靜態方法只能訪問靜態對象。

所以,如果你將在你的靜態方法中使用任何對象,它也將是靜態的,因此對所有線程都具有相同的值。

所以你可以很容易地做到這一點。

2

我同意,該方法是非常好的。

雖然要小心,但該方法可能是線程安全的,但傳入的List不是。如果(例如)迭代列表,而另一個線程插入字符串,則可能會遇到一些問題。當然,字符串不可變是線程安全的。

1

要了解靜態變量/方法與實例變量/方法的基本知識,請閱讀this tutorial或搜索類似的內容。另外,this question及其答案應該能夠幫助解釋何時線程安全的方法(您的程序沒有修改任何可以在線程之間共享的數據,所以它非常安全)。

至於你的代碼,你的方法簽名應該是這個樣子:

public static List<List<String>> test(List<String> input) {...} 

,因爲你會返回一個字符串列表的列表。