【问题标题】:Reusable Java StringReader可重用的 Java StringReader
【发布时间】:2015-04-22 23:01:48
【问题描述】:

是否有任何方法可以实现 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。不过,这确实是一个 hack。

有更好的解决方案的想法吗?

【问题讨论】:

  • 请移除“离题”限制。这是一个关于解决现实世界问题的潜在实现的非常有效的问题,在问题测试中非常清楚地描述了这一点。我改写了它以删除术语“开源实现”,但即使这样也不应该是必要的。这里没有什么“固执”。

标签: java reader stringreader


【解决方案1】:

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

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

但是,如果您仍想继续这样做,只需编写自己的 Readerreset(),不要担心 JDK 变体。您可能会看到实现,但它非常简单。尝试子类化、委托或组合几乎没有什么好处:特别是如果您真的关心最小分配量。

【讨论】:

  • 对处理的每行使用新的StringReader 是一种方法,创建另一种类型的Reader 也是如此。但是,如果我想要一个StringReader,按照原来的问题呢? :-)
  • 啊——有人期待StringReader 被传递吗?如果是这样,则可能是子类,但重新实现......有点浪费,因为现有字段将被忽略,而且不优雅,但允许类型作为StringReader 传递而无需每行实例化。实际上,当 API 需要一个具体类型时,我不得不对另一个 JDK i/o 类(我忘了是哪一个)做类似的事情。
  • 是的,子类化本质上意味着复制所有StringReader 代码,只是添加一个执行一些赋值的方法。这正是我发布这个问题的原因。谢谢和+1。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 2011-04-29
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多