哪种方法更好?静态方法中的 ArrayList 很混乱
Which approach is better? ArrayList inside static method is confused
我主要关心的是实现以下场景的线程安全性,我想看看使用静态方法是否比普通对象实例更好,反之亦然。
我读了一些文章,但我更困惑了。
- Web 应用程序将从每个 http 表单提交中接收字符串文本。每个表单提交都是包含项目 ID 的文本以及用户创建的自由文本。
- 字符串文本将被解析。解析时,将创建本地 ArrayList 并将此本地 ArrayList 用作项目的临时占位符。 因为这个ArrayList,我不确定静态方法是否合适。
- 使用此 ArrayList,将重新格式化文本。 ArrayList 将循环遍历并使用一些文本进行格式化。
通常我会创建简单的静态方法,将字符串作为输入和 return 格式化文本。但是由于 ArrayList 被用作局部变量,我不确定静态方法是否是正确的选择,或者我是否应该为它创建普通的对象实例。由于 ArrayList 是局部变量,但是将其设计为成员变量并将 class 实例化为以输入文本作为成员变量的对象比静态方法更好吗?
下面class是我做的,但不确定我是否应该重写为非静态。
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")
记住:static可以看作是异常好的OO。
使用static意味着在您的类之间引入紧耦合;更糟糕的是:你 "kill" 多态性;这是 OO 的基石之一。
从这个意义上说:默认是不使事情静态化。例外可能是具有 非常 defined/clear 范围的助手/实用程序 类。所以从那个角度来说你还可以。
除此之外:不用担心。当您拥有多个线程操作的 shared 数据时,代码对线程变得敏感。在你的例子中 - 你没有那个:调用你的方法的每个线程......将创建它的 own 列表实例!
含义:如果您的代码如下所示:
public class A {
private List<String> itemList;
然后您的不同方法将使用该静态字段;那么你将面临多线程问题。但是您显示的代码不依赖于 shared 数据 - 因为它 not 使用任何静态字段。
我主要关心的是实现以下场景的线程安全性,我想看看使用静态方法是否比普通对象实例更好,反之亦然。 我读了一些文章,但我更困惑了。
- Web 应用程序将从每个 http 表单提交中接收字符串文本。每个表单提交都是包含项目 ID 的文本以及用户创建的自由文本。
- 字符串文本将被解析。解析时,将创建本地 ArrayList 并将此本地 ArrayList 用作项目的临时占位符。 因为这个ArrayList,我不确定静态方法是否合适。
- 使用此 ArrayList,将重新格式化文本。 ArrayList 将循环遍历并使用一些文本进行格式化。
通常我会创建简单的静态方法,将字符串作为输入和 return 格式化文本。但是由于 ArrayList 被用作局部变量,我不确定静态方法是否是正确的选择,或者我是否应该为它创建普通的对象实例。由于 ArrayList 是局部变量,但是将其设计为成员变量并将 class 实例化为以输入文本作为成员变量的对象比静态方法更好吗?
下面class是我做的,但不确定我是否应该重写为非静态。
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")
记住:static可以看作是异常好的OO。
使用static意味着在您的类之间引入紧耦合;更糟糕的是:你 "kill" 多态性;这是 OO 的基石之一。
从这个意义上说:默认是不使事情静态化。例外可能是具有 非常 defined/clear 范围的助手/实用程序 类。所以从那个角度来说你还可以。
除此之外:不用担心。当您拥有多个线程操作的 shared 数据时,代码对线程变得敏感。在你的例子中 - 你没有那个:调用你的方法的每个线程......将创建它的 own 列表实例!
含义:如果您的代码如下所示:
public class A {
private List<String> itemList;
然后您的不同方法将使用该静态字段;那么你将面临多线程问题。但是您显示的代码不依赖于 shared 数据 - 因为它 not 使用任何静态字段。