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