可重用的Java StringReader

时间:2015-04-22 23:01:49

标签: java reader stringreader

有没有办法实现一个StringReader类,它允许在不改变任何功能(方法)的情况下重用相同的StringReader(或类似功能)对象,而不改变它的任何功能(方法)?

例如,这样的Java类(比如ReusableStringReader)将是java.io.StringReader的子类,有一个额外的方法,如

public void reset(String str);

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

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

  1. 继承。 StringReader的所有内部状态都存储在私有实例变量中,因此这不是一个选项。
  2. 反思。通过反射重置StringReader对象的内部状态。要设置4个实例变量,这意味着每个“reset(String)”调用有4个反射调用(效率不高)。
  3. 撰写。可以使用可重复使用的StringInputStream,然后通过Reader创建InputStreamReader对象,然后在内部使用Reader StringReader的子类,用于实现StringReader类的完整API。不过,这非常黑客。
  4. 任何有关更好解决方案的想法?

1 个答案:

答案 0 :(得分:3)

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

所以我完全不担心可重用性:use-once实例更安全,更简单。一般而言,实际受益于重复使用轻量物体(例如读取器)是相对罕见的。

但是,如果您仍想继续这样做,只需使用Reader编写自己的reset(),并且不要担心JDK变体。你可能会偷看实现,但它很简单。尝试子类,委托或撰写没有什么好处:特别是如果你真的担心最小的分配数量。