0

我最近有以下想法:当你定义你的对象并覆盖 toString 方法时,在程序执行过程中可能会被多次调用。我不确定某些 UI 组件如何刷新自己(刷新时 JTable 是否会调用每个单元格成员的 toString 方法),或者每次当您执行修改对象的指令时调试器是否调用 toString 等。无论如何,我在想它是否会如果我们的结构是 IMMUTABLE,则将惰性求值的 String 定义为我们的 to String 定义是有益的:

private String toString;
//.. definitions of many components, sets, lists which won't change

public String toString(){
   if (toString == null) // instantiate
   return toString;
}

以上值得做吗?

4

3 回答 3

2

如果字符串创建过程较长,且创建的字符串经常被使用,则应存储。如果不是,则取决于您将调用该toString()方法的次数(内存和 CPU 时间之间总是同样的老战争)

如果您的类是不可变的并且您知道该toString()方法将至少被调用一次,您应该在构造函数(或工厂)中实例化字符串,而不是总是检查。

于 2012-10-19T10:24:51.943 回答
0

优化的标准规则在这里发挥作用。

  1. 不要这样做。
  2. (仅适用于专家)暂时不要这样做——至少在您获得分析信息说明为什么这是一个需要解决的问题之前不要这样做。

由于性能原因,您正在失去清晰度和可维护性,因此请量化这些性能原因是什么以及它们是否值得付出代价。

于 2012-10-19T10:30:21.573 回答
0

由于 Javas String Literal Pool,您不必担心这一点。假设您没有创建大量唯一字符串,Java 将在加载类文件或初始化时遍历您的代码并查找字符串,并将它们添加到字符串文字池中。

这是一篇很棒的文章,并通过漂亮的图表对此进行了概述 -字符串文字池概述

其他建议是使用 StringBuffers,因为独立部分不会仅将输出字符串添加到缓冲区中。

将 StringBuffer 设为静态也可以避免每次都创建一个新对象,但这实际上取决于您调用 toString() 的频率。

如果这真的是像 Tom Johnson 建议的那样运行分析器的瓶颈,那将是下一个方向。

于 2012-10-19T11:00:10.560 回答