我主要担心的是线程安全,以实现以下场景,我试图看看是否使用静态方法比普通对象实例更好,反之亦然。 我读了一些文章,但我更加困惑。
通常我会创建简单的静态方法,将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")
答案 0 :(得分:3)
请注意: static 可以被视为异常以获得良好的OO。
使用 static 意味着在您的类之间引入紧密耦合;更糟糕的是:你“杀死”多态性;这是OO的基石之一。
从这个意义上说:默认不是让事情变得静止。例外可能是具有非常定义/清除范围的辅助/实用程序类。所以从这个角度来看你还可以。
除此之外:不用担心。当您拥有多个线程操作的共享数据时,代码会对线程敏感。在你的例子中 - 你没有:调用你的方法的每个线程......将创建它的自己的列表实例!
含义:如果您的代码看起来像:
public class A {
private List<String> itemList;
然后你的不同方法将使用静态字段;那么你将面临多线程问题。但是您显示的代码并不依赖于共享数据 - 因为不使用任何静态字段。