关于内联来自effective_java书的调用

时间:2017-11-20 03:40:51

标签: java effective-java

我在effective_java这个书中有一个问题, “现代Java虚拟机(JVM)实现的意思几乎肯定是内联对静态工厂方法的调用。” 我不明白'内联调用静态工厂方法'

引用:

  

公共领域方法的主要优点是   声明清楚表明该类是一个单身人士:公众   static field是final,因此它将始终包含相同的对象   参考。公众不再有任何业绩优势   现场方法:现代Java虚拟机(JVM)实现   几乎肯定要内联对静态工厂方法的调用

1 个答案:

答案 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使用该字段)不再存在(或者,它的可能性非常小),因为编译器足够聪明,可以在编译的字节码中内联调用,因此两种方法的性能相似,而第二种方法更好,因为它提供了封装。