java - 可重用的 Java StringReader

标签 java reader stringreader

有没有一种方法可以实现一个StringReader类,允许重复使用具有多个字符串的相同StringReader(或类似功能)对象,而不改变其任何功能(方法)?

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

public void reset(String str);

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

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

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

有更好的解决方案吗?

最佳答案

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

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

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

关于java - 可重用的 Java StringReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29810488/

相关文章:

java - StringReader 的 mark() 方法

java - 无法解码 SOAP 响应

java - 使用 JRE 1.5 和 JDK 1.6 时 DocumentBuilder.parse 的区别

java - 无法将 google-api-services-admin-directory 组织转换为 JSONArray。因为缺少 customType 值

java - 检测动画何时结束 (Android studio)

c# - MySQL 数据读取器和复选框

java - 旋转文档的单页

css - 将文本颜色设置为透明以隐藏辅助功能内容?

javascript - 加载 JSON 文件并将其附加到 map