是否应该在每次使用番石榴分离器/连接器时创建?

时间:2017-03-03 16:54:54

标签: java instance guava

Guava包含用于拆分和连接Strings的实用程序,但它需要实例化Splitter / Joiner对象才能执行此操作。这些是小对象,通常只包含要分割/连接的字符。保持对这些对象的引用以便重用它们是一个好主意,还是只在需要时创建它们并让它们被垃圾收集?

例如,我可以通过以下两种方式实现此方法:

String joinLines(List<String> lines) {
  return Joiner.on("\n").join(lines);
}

OR

static final Joiner LINE_JOINER = Joiner.on("\n");

String joinLines(List<String> lines) {
  return LINE_JOINER.join(lines);
}

我发现第一种方式更具可读性,但每次调用该方法时创建一个新的Joiner似乎都很浪费。

2 个答案:

答案 0 :(得分:3)

老实说,这听起来像是对我的过早优化。我同意@Andy Turner,写下最容易理解和维护的内容。

如果您打算在少数地方使用Joiner.on("\n"),请将其命名为常量;选择二。

如果您只打算在joinLines方法中使用它,则常量似乎过于冗长;选择一个。

答案 1 :(得分:2)

这在很大程度上取决于您期望调用代码的频率以及您希望在CPU时间,内存消耗和可读性之间进行哪些权衡。由于Joiner是一个很小的东西,它不会产生很大的不同:如果你使它成为一个常数,你可以节省(相当小的)分配它的成本并为每次调用GCing它,同时添加程序的(相当小的)内存消耗开销。

它还部分取决于您运行代码的平台:如果您在服务器上运行,通常您将拥有足够的内存,因此保持常量不会成为问题。另一方面,如果您在Android上运行,则内存受限,但 还希望避免不必要的分配,因为垃圾收集会更糟,对您的性能影响更大。< / p>

就个人而言,我倾向于分配一个常量,除非我知道它只会被使用一定次数,而不是在整个程序中反复使用。