我在effective_java这个书中有一个问题, “现代Java虚拟机(JVM)实现的意思几乎肯定是内联对静态工厂方法的调用。” 我不明白'内联调用静态工厂方法'
引用:
公共领域方法的主要优点是 声明清楚表明该类是一个单身人士:公众 static field是final,因此它将始终包含相同的对象 参考。公众不再有任何业绩优势 现场方法:现代Java虚拟机(JVM)实现 几乎肯定要内联对静态工厂方法的调用
答案 0 :(得分:0)
“公共领域方法”(摘自书籍"Effective Java" By Josh Bloch):
// Singleton with public final field
public class Elvis {
public static final Elvis Elvis = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
}
虽然你在报价中提到的方法是静态工厂:
// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
您提到的引用解释了静态工厂方法的“性能损失”(因为我们调用方法getInstance
而不是直接通过:Elvis.INSTANCE
使用该字段)不再存在(或者,它的可能性非常小),因为编译器足够聪明,可以在编译的字节码中内联调用,因此两种方法的性能相似,而第二种方法更好,因为它提供了封装。