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