哪种方法更好?静态方法里面的ArrayList很混乱

时间:2017-05-24 15:23:41

标签: java arraylist static-methods

我主要担心的是线程安全,以实现以下场景,我试图看看是否使用静态方法比普通对象实例更好,反之亦然。 我读了一些文章,但我更加困惑。

  1. Web应用程序将从每个http表单提交中接收String文本。每个表单提交都是包含项目ID的文本,其中包含用户创建的自由文本。
  2. 将解析字符串文本。在解析时,将创建本地ArrayList,并将此本地ArrayList用作项目的临时占位符。 由于这个ArrayList,我不确定静态方法是否合适。
  3. 使用此ArrayList,将重新格式化文本。 ArrayList将循环并使用一些文本进行格式化。
  4. 通常我会创建简单的静态方法,将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")
    

1 个答案:

答案 0 :(得分:3)

请注意: static 可以被视为异常以获得良好的OO。

使用 static 意味着在您的类之间引入紧密耦合;更糟糕的是:你“杀死”多态性;这是OO的基石之一。

从这个意义上说:默认不是让事情变得静止。例外可能是具有非常定义/清除范围的辅助/实用程序类。所以从这个角度来看你还可以。

除此之外:不用担心。当您拥有多个线程操作的共享数据时,代码会对线程敏感。在你的例子中 - 你没有:调用你的方法的每个线程......将创建它的自己的列表实例!

含义:如果您的代码看起来像:

public class A {
  private List<String> itemList;

然后你的不同方法将使用静态字段;那么你将面临多线程问题。但是您显示的代码并不依赖于共享数据 - 因为使用任何静态字段。