为什么Class.getSimpleName()没有缓存?

时间:2013-06-28 16:21:11

标签: java

如果你查看Sun的Class.getSimpleName()实现的源代码,你会发现它似乎每次调用它时都会返回一个新的String实例。然而,Class类中的许多其他功能都被缓存。

由于简单名称计算似乎并不容易,并且JavaDoc中没有任何内容表明它必须每次都返回一个新实例,因此它应该是缓存的一个很好的候选者。我想知道为什么没有缓存会有任何设计理由?

我在问,因为许多框架一直使用简单的名称,这很容易缓存。

3 个答案:

答案 0 :(得分:3)

更新:OpenJDK 11中缓存的名称

在OpenJDK 11和更高版本中缓存了类名 。请参见Class.java的OpenJDK源代码,并搜索从private ReflectionData<T> reflectionData()方法调用的getSimpleName方法。

有关详细信息,请参见故障单JDK-8187123

答案 1 :(得分:2)

可能因为它不是一种昂贵的方法,所以缓存它并没有太大的收获。

String.substring是一种廉价的方法 - 它重用底层char[]而不复制它,而新的String对象在该数组中只有不同的偏移量和长度。所以真正唯一的成本是(1)对象分配 - 在Java中相当便宜 - 以及(2)lastIndexOf调用。那个调用在技术上是O(N),但是这里的N是类的简单名称,在实践中不会非常大。

您可以缓存它,但代价是更多内存。我的猜测是,有人做出了主观但受过教育的猜测,认为其好处不会超过成本。

答案 2 :(得分:1)

有趣的问题。由于String是一个不可变类,因此如果返回不同的实例或对同一对象的引用并不重要。 我的猜测是(而且我主要是为了听听我是对还是错),这种方法可能不会经常被调用,重新创建(String)对象比将其存储更有意义记忆。但同样,这只是猜测。