2017-05-24 93 views
1

我主要關心的是線程安全的實現以下場景,我想看看是否比普通對象實例更好地使用靜態方法,反之亦然。 我讀了一些文章,但我更困惑。哪種方法更好?靜態方法內的ArrayList是困惑

  1. Web應用程序將從每個http表單提交中接收字符串文本。每個表單提交都是包含由用戶創建的自由文本的項目ID的文本。
  2. 字符串文本將被解析。在解析時,將創建本地ArrayList,並將此本地ArrayList用作項目的臨時佔位符。 由於這個ArrayList,我不確定靜態方法是否合適。
  3. 使用此ArrayList,文本將被重新格式化。 ArrayList將循環並用一些文本進行格式化。

通常我會創建簡單的靜態方法以String作爲輸入並返回格式化文本。但由於ArrayList被用作局部變量,我不確定靜態方法是否正確選擇,或者我應該爲它創建普通的對象實例。由於ArrayList是局部變量,但是將它設計爲成員變量並將類實例化爲輸入文本作爲成員變量而不是靜態方法的對象?

下面的類是我做的,但不知道我是否應該重寫爲非靜態的。

public class A { 

private static List<Item> parseFreeText(String message){ 

     List<Item> itemList = new ArrayList<Item>(); 
     /* 
     read message line by line and parse it and build ArrayList and return 

     itemList.add(item); 
     */ 

     return itemList; 
}  

public static String formattedTextOfItems(String message){ 

    List<Item> itemList = parseFreeText(message);  
    StringBuilder sb = new StringBuilder(); 
    for(Item item: itemList){ 
     /* format string with item information */ 
     sb.append("ITEM ID: " + item.getId()); 
    } 
    return sb.toString(); 
} 

,並在servlet的層將用作以下

String order = A.formattedTextOfItems(req.getParameter("orderText") 
+2

取決於它的使用方式;這些都不像所介紹的那樣是遠程線程安全的。 –

+0

將使用此實用程序類,並在servlet內調用一個方法。主要目的是解析從Web表單提交的輸入文本。 –

回答

3

請記住:靜態可以看作是異常良好的面向對象。

使用靜態意味着引入你的類之間的耦合;甚至更糟糕:你「殺死」了多態性;這是面向對象的基石之一。

從這個意義上說:默認不是靜態的東西。例外情況可能是幫助程序/實用程序類具有非常定義/清除範圍。所以你可以從這個角度來看。

除此之外:無後顧之憂。當您有共享多個線程操作的數據時,代碼變得對線程敏感。在你的例子中 - 你沒有那個:調用你的方法的每個線程...將創建它的自己的列表實例!

含義:如果你的代碼看起來像:

public class A { 
    private List<String> itemList; 

和靜態字段,然後將你的不同的方法來使用;那麼你將面臨多線程問題。但是您顯示的代碼不依賴於共享的數據 - 因爲它是而不是使用任何靜態字段。

+0

謝謝,是的,我同意你的觀點。這應該是一個實用工具類,它將String作爲輸入並返回重新格式化文本。我的困惑是使用靜態方法內的ArrayList或任何集合,並擔心線程問題。謝謝你的解釋。 –