class.getName()贵吗?

Tom*_*sky 11 java

在我正在处理的项目的许多类中,我看到名为CLASS_NAME的私有静态最终成员,其定义如下:

public class MyClass {
  private static final String CLASS_NAME = MyClass.class.getName();
  //...
}
Run Code Online (Sandbox Code Playgroud)

这样做有什么好处来获取类名,而不是MyClass.class.getName()直接在需要名称的地方进行调用?

Ale*_*exR 12

这是执行 Class.getName()

public String getName() {
if (name == null)
    name = getName0();
return name;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,name的值被缓存,因此调用并不太昂贵.这就像常规吸气者的召唤一样.无论如何,如果你经常调用它,那么定义常量可能是一种很好的风格.


Edw*_*uck 6

缓存类名将带来另一个引用的开销.这改变了JVM操作码(cpu复杂性)的内存占用成本.

这些天CPU非常快,它们基本上等待内存,所以如果你必须在操作码和内存占用之间做出选择,你最好选择通过JVM运行更多的操作码.

起初这似乎并不直观; 但是,请考虑JVM和周围的硬件.较大的内存占用量意味着缓存中最近访问的项目较少,重新获取缓存中的项目的成本大约是运行单个JVM操作码的成本的1,000到10,000倍.将此与JVM的jit引擎相结合,大量访问的代码块的CPU复杂性可以免费优化(除了其他所有内容).

因此,一般来说,我会通过不缓存引用来修剪对象,因为它会允许更多的对象被推入1级缓存.但是,与所有现实世界的性能调整一样,您应该测试结果是否与假设相符,并且以不会被JVM的所有其他内部工作混淆的方式进行测试.