2017-11-20 27 views
-3

この本のeffective_javaに質問があります。 最新のJava仮想マシン(JVM)実装の意味は、静的ファクトリメソッドへの呼び出しをほぼ確実にインライン化しています。 私はeffective_javaからの呼び出しをインラインで呼び出す

引用「staticファクトリメソッドにインライン呼び出し」を理解していない:

パブリックフィールド・アプローチの主な利点は、 宣言はそれを明確にクラスがシングルトンであることを確認ということです:public staticフィールドはfinalなので、常に同じオブジェクト 参照を含んでいます。公共 フィールドアプローチへのパフォーマンス上の利点はなくなりました。現代のJava仮想マシン(JVM)の実装は、静的ファクトリメソッド

+1

これは、もう少し多くのコンテキストを持つのに役立ちます。作者がバイトコードへのコンパイル、バイトコードからのJITコンパイル、またはVMが解釈中に行う可能性のある特定のバイトコード最適化について話しているかどうかは、あいまいです。 – lockcmpxchg8b

+1

本を引用している場合は、必要に応じて完全な引用文と追加の文脈を入力してください。 – alfasin

+0

これは少し話題ですが、その本は熟練のJavaプログラマーのためのものです –

答えて

0

への呼び出しに「公共の場のアプローチを」インライン化することはほぼ一定 ある(取られますあなたが引用符でに言及しているアプローチは、静的なファクトリです

// Singleton with public final field 
public class Elvis { 
    public static final Elvis Elvis = new Elvis(); 
    private Elvis() { ... } 

    public void leaveTheBuilding() { ... } 
} 

ながら::ブック"Effective Java" By Josh Bloch)から

// 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() { ... } 
} 

あなたが言った引用は、静的ファクトリーアプローチの「パフォーマンスペナルティ」(Elvis.INSTANCE経由でフィールドを直接使用するのではなく、getInstanceというメソッドを呼び出しているため)がなくなった(または、コンパイラはコンパイルされたバイトコードの呼び出しをインライン化するのに十分なほどスマートなので、両方のアプローチのパフォーマンスは似ていますが、カプセル化を提供するので、第2のアプローチが優れています。

+1

ああ、私は理解しているようです!ありがとう – sunh

関連する問題