3

この2つのアプローチの違いを知っている人はいますか?

public class SingleTone {

    private static final instance = new SingleTone();

    private SingleTone() {
    }
    public [static] SingleTone getinstance() {
        return instance;
    }
} 

public class SingleTone {

    private static instance = new SingleTone();

    private SingleTone() {
    }
    public  [static] SingleTone getinstance() {
        return instance;
    }
} 

最終的な静的変数はスレッドセーフであることは知っていますが、非最終的な静的変数で問題を見つけることはできません。(注:最終的な静的変数と非最終的な静的変数の違いを求めているので、シングルトンデザインパターンの実装方法を提案しないでください。列挙型アプローチがあることはわかっています。)

編集:メソッドの静的キーワードを見逃しましたが、修正されました!

4

3 に答える 3

2

可能なコンパイラの最適化を除いて、大きな違いはありません。どちらの場合も、セッターのないプライベートなので、変更できるものは何もないので、変更するかどうかは特に問題ではありませfinalん。ただし、どちらの場合も、getInstance()メソッドを宣言する必要がありますstatic

于 2013-03-18T19:32:50.553 に答える
2

修飾子は、そのfinalフィールドに他に何も割り当てられないことを意味します。つまり、equals(=)演算子を使用することはできません。修飾子は、変数がインスタンスの一部ではなくクラスの一部であることをstatic意味しますが、インスタンスの数に関係なく、そのうちの1つだけが存在します。

最初のアプローチでは、初期化後に値が変更されないことがわかっているため、参照をスレッドセーフにします。ただし、最終的な構造がある場合は、コンテンツも同期されていることを確認する必要があります。詳細については、この質問を参照してください。

于 2013-03-18T19:32:53.763 に答える
0

final あなたの場合、特別なパフォーマンスの向上はありません。

明確な設計アプローチのために final を使用します。Josh Bloch の「継承または禁止のための設計」の経験則によると、おそらく、この場合だけでなく、クラス全般に対してより頻繁に final を使用する必要があります。

于 2013-03-18T19:41:14.117 に答える