2013-06-09 8 views
23

私はシングルトンパターンを実装するには、次のコードを書きました:私は、このファイルをコンパイルするとき

public final class Test { 
    static final class TestHolder { 
     private static final Test INSTANCE = new Test(); 
    }  

    private Test() {} 

    public static Test getInstance() { 
     return TestHolder.INSTANCE; 
    } 
} 

、それはTest.classとテスト$ TestHolder.classを生成する必要がありますが、それはまた、テストの$ 1.classを生成します。これは意味をなさない。それでなぜ、どうやってこれができますか? Testでプライベートコンストラクタを呼び出す必要があるTestHolder

+0

http://c2.com/cgi/wiki?AnonymousInnerClass – sircapsalot

+3

は*どこ*匿名クラスです。 –

+2

これはupvoteする価値がある質問のタイプです。 –

答えて

25

クラス。しかしそれはプライベートで、実際に別のクラスから呼び出すことはできません。コンパイラはトリックを演じます。 は、それが知っているTestに新しい非プライベートコンストラクタを追加します!このコンストラクタは、この匿名クラスTest$1のインスタンス(未使用)を取ります。その後TestHolderTest$1のインスタンスを作成し、アクセス可能であるそのコンストラクタを呼び出します(これのデフォルトで保護されています。)

をあなたは、コードを見てjavap -c Test(およびjavap -c Test\$1、およびjavap -c Test\$TestHolder)を使用することができます。それは実際には、非常に賢いです!質問@sircapsalot

+0

バイトコードを逆コンパイルすると、この応答がサポートされます。静的INNERCLASS Test $ 1 Test nullが生成されます。 – Makoto

+0

偉大な答え、賢明な実装。あなたは頭の上からこれを知っていましたか? – Vulcan

+0

@バルカン、いいえ、私はしませんでした。興味深い質問だったと思って、コードをコンパイルし、javapでチェックアウトし、見つけたものを説明しました。 –

関連する問題