如果你查看Sun的Class.getSimpleName()
实现的源代码,你会发现它似乎每次调用它时都会返回一个新的String实例。然而,Class类中的许多其他功能都被缓存。
由于简单名称计算似乎并不容易,并且JavaDoc中没有任何内容表明它必须每次都返回一个新实例,因此它应该是缓存的一个很好的候选者。我想知道为什么没有缓存会有任何设计理由?
我在问,因为许多框架一直使用简单的名称,这很容易缓存。
答案 0 :(得分:3)
在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)对象比将其存储更有意义记忆。但同样,这只是猜测。