可重用 Java StringReader

Reusable Java StringReader

有没有什么方法可以实现 StringReader class 允许使用多个字符串重用相同的 StringReader(或类似功能)对象,而不改变其任何功能(方法)?

例如,这样的 Java class(例如,ReusableStringReader)将是 java.io.StringReader 的子 class,带有一个额外的方法,例如

public void reset(String str);

这会将新的字符串值分配给内部 StringReader 参数,以便所有对 StringReaderread() 方法的后续调用都使用新值。当想要限制应用程序使用的对象数量时,这样的 "reusability" 非常方便(例如,通过 Reader 对象每秒处理大量字符串的应用程序)。

实现此目的的一般方法是:

  1. 继承。 StringReader 的所有内部状态都存储在私有实例变量中,因此这不是一个选项。
  2. 反射。 通过反射重置 StringReader 对象的内部状态。有 4 个实例变量要设置,这意味着每个 "reset(String)" 调用有 4 个反射调用(效率不是太高)。
  3. Composition. 可以使用可重复使用的 StringInputStream 并通过 InputStreamReader 从中创建一个 Reader 对象,然后使用那个 ReaderStringReader 的子 class 内部实现 StringReader class 的完整 API。不过,这确实是一个 hack。

有更好的解决方案吗?

我认为您很可能在这里过早地优化了一个非问题,除非您实际测量发现 StringReader 个实例会导致严重的 GC 压力。由于阅读内容而发生的分配更有可能更有意义。

所以我完全不担心可重用性:使用一次的实例更安全、更简单。一般来说,真正受益于重用轻量级对象(例如阅读器)的情况相对较少。

但是,如果您仍然想继续这样做,只需编写自己的 Readerreset(),不要担心 JDK 变体。您可能会偷看实现,但它非常简单。尝试子class、委托或组合几乎没有什么好处:特别是如果你真的很关心最少的分配量。