Guava Splitters/Joiners 每次使用都要创建吗?
Should Guava Splitters/Joiners be created each time they are used?
Guava 包含用于拆分和连接字符串的实用程序,但它需要实例化 Splitter/Joiner 对象才能执行此操作。这些是小对象,通常只包含 split/join 所在的字符。维护对这些对象的引用以便重用它们是个好主意,还是最好在需要时创建它们并让它们被垃圾收集?
例如,我可以通过以下两种方式实现此方法:
String joinLines(List<String> lines) {
return Joiner.on("\n").join(lines);
}
或
static final Joiner LINE_JOINER = Joiner.on("\n");
String joinLines(List<String> lines) {
return LINE_JOINER.join(lines);
}
我觉得第一种方式更具可读性,但每次调用该方法时都创建一个新的 Joiner 似乎很浪费。
老实说,这对我来说听起来像是过早的优化。我同意@Andy Turner 的观点,写下最容易理解和维护的内容。
如果您打算在几个地方使用 Joiner.on("\n")
,请将其命名为常量;选择选项二。
如果您只打算在 joinLines
方法中使用它,常量似乎过于冗长;选择选项一。
这在很大程度上取决于您期望代码被调用的频率以及您希望在 CPU 时间、内存消耗和可读性之间做出的权衡。由于 Joiner
是一个很小的东西,它不会产生很大的不同:如果你让它成为一个常量,你可以节省(相当小的)分配它的成本并为每次调用 GCing 它,同时添加程序的(相当小的)内存消耗开销。
它还部分取决于您 运行 代码所在的平台:如果您 运行 在服务器上,通常您会有足够的内存,因此保持不变不会成为问题。另一方面,如果您 运行 在 Android 上,您的内存会受到更多限制,但您 也 想要避免不必要的分配,因为垃圾收集正在进行变得更糟,对您的表现影响更大。
就个人而言,我倾向于分配一个常量,除非我知道它只会被使用一些固定次数,而不是在整个程序中重复使用。
Guava 包含用于拆分和连接字符串的实用程序,但它需要实例化 Splitter/Joiner 对象才能执行此操作。这些是小对象,通常只包含 split/join 所在的字符。维护对这些对象的引用以便重用它们是个好主意,还是最好在需要时创建它们并让它们被垃圾收集?
例如,我可以通过以下两种方式实现此方法:
String joinLines(List<String> lines) {
return Joiner.on("\n").join(lines);
}
或
static final Joiner LINE_JOINER = Joiner.on("\n");
String joinLines(List<String> lines) {
return LINE_JOINER.join(lines);
}
我觉得第一种方式更具可读性,但每次调用该方法时都创建一个新的 Joiner 似乎很浪费。
老实说,这对我来说听起来像是过早的优化。我同意@Andy Turner 的观点,写下最容易理解和维护的内容。
如果您打算在几个地方使用 Joiner.on("\n")
,请将其命名为常量;选择选项二。
如果您只打算在 joinLines
方法中使用它,常量似乎过于冗长;选择选项一。
这在很大程度上取决于您期望代码被调用的频率以及您希望在 CPU 时间、内存消耗和可读性之间做出的权衡。由于 Joiner
是一个很小的东西,它不会产生很大的不同:如果你让它成为一个常量,你可以节省(相当小的)分配它的成本并为每次调用 GCing 它,同时添加程序的(相当小的)内存消耗开销。
它还部分取决于您 运行 代码所在的平台:如果您 运行 在服务器上,通常您会有足够的内存,因此保持不变不会成为问题。另一方面,如果您 运行 在 Android 上,您的内存会受到更多限制,但您 也 想要避免不必要的分配,因为垃圾收集正在进行变得更糟,对您的表现影响更大。
就个人而言,我倾向于分配一个常量,除非我知道它只会被使用一些固定次数,而不是在整个程序中重复使用。