可重复使用的Java StringReader



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

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

public void reset(String str);

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

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

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

有什么更好的解决方案吗?

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

所以我根本不担心可重用性:一次性使用实例更安全、更简单。一般来说,很少有人真正从阅读器等轻量级对象的重用中获益。

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

相关内容

  • 没有找到相关文章

最新更新