是否有任何方法可以实现StringReader
类,该类允许使用多个字符串重用同一StringReader
(或类似功能)对象,而不更改其任何功能(方法)?
例如,这样一个Java类(比如ReusableStringReader
)将是java.io.StringReader
的一个子类,带有一个额外的方法,比如
public void reset(String str);
其将把新的字符串值分配给内部StringReader
参数以使得对StringReader
的read()
方法的所有后续调用都使用新的值。当想要限制应用程序使用的对象数量时(例如,通过Reader
对象每秒处理大量字符串的应用程序),这种"可重用性"非常方便。
实现这一目标的一般方法是:
- 继承StringReader的所有内部状态都存储在私有实例变量中,因此这不是一个选项
- 反射通过反射重置
StringReader
对象的内部状态。有4个实例变量需要设置,这意味着每个"reset(String)"调用有4个反射调用(效率不太高) - 组成可以使用一个可重用的
StringInputStream
,然后通过InputStreamReader
创建一个Reader
对象,然后在StringReader
的子类中内部使用该Reader
,以实现StringReader
类的完整API。不过,这是一个相当不错的破解
有什么更好的解决方案吗?
我认为您很可能过早地优化了这里的非问题,除非您已经实际测量到StringReader
实例会导致严重的GC压力。更有可能的是,由于阅读内容而发生的分配更有意义。
所以我根本不担心可重用性:一次性使用实例更安全、更简单。一般来说,很少有人真正从阅读器等轻量级对象的重用中获益。
然而,如果您仍然想追求这一点,只需使用reset()
编写您自己的Reader
,并且不必担心JDK变体。您可能会看到实现,但它非常简单。尝试子类、委托或组合几乎没有什么好处:尤其是当您真正关心最小分配量时。