首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可重用的Java StringReader

可重用的Java StringReader
EN

Stack Overflow用户
提问于 2015-04-22 23:01:48
回答 1查看 977关注 0票数 1

是否有任何实现StringReader类的方法,允许重用具有多个字符串的相同StringReader (或类似功能)对象,而不更改其任何功能(方法)?

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

代码语言:javascript
复制
public void reset(String str);

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

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

  1. Inheritance. -- StringReader的所有内部状态都存储在私有实例变量中,因此这不是一个选项。
  2. 反射。通过反射重置StringReader对象的内部状态。有4个实例变量需要设置,这意味着在每个“重置(字符串)”调用中有4个反射调用(不太有效)。
  3. Composition.可以使用一个可重用的StringInputStream,然后通过InputStreamReader创建一个Reader对象,然后在StringReader的子类中使用这个Reader来实现StringReader类的完整API。不过,这是个相当大的黑客。

有更好的解决办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-22 23:14:44

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

因此,我一点也不担心可重用性:一旦实例变得更加安全和简单,就可以使用它。一般来说,相对较少的实际受益于轻量级对象的重用,例如读取器。

但是,如果您仍然想要这样做,只需使用Reader编写自己的reset(),而不必担心JDK变体。您可以查看实现,但它非常简单。尝试子类、委托或组合几乎没有什么好处:特别是当您真正关心的是数量最少的分配时。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29810488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档