1

是否有任何方法可以实现一个StringReader类,该类允许使用StringReader多个字符串重用相同(或类似功能)对象,而无需更改其任何功能(方法)?

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

public void reset(String str);

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

实现这一目标的一般方法是:

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

有更好的解决方案的想法吗?

4

1 回答 1

3

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

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

但是,如果您仍然想追求这一点,只需使用 编写您自己Readerreset(),不要担心 JDK 变体。您可能会看到实现,但它非常简单。尝试子类化、委托或组合几乎没有什么好处:特别是如果您真的关心最小分配量。

于 2015-04-22T23:14:44.913 回答