0

以下のクラスを final にする (public finalクラスを追加する) と、シングルトン パターンを実装するというこのクラスの意図に実際の影響がありますか?

package org.kodejava.example.pattern.factory;

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        return instance;
    }

    public void doSomething() {
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
        }
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("Clone is not allowed.");
    }
}
4

4 に答える 4

2

いいえ、そうではありません。コンストラクターはプライベートであるため、サブクラス化することはできません。それは事実をより明確にするだけであり、それが私がfinal個人的に使用する理由です.

于 2012-06-08T18:28:51.527 に答える
1

これを見てください、

これを行う場合:

private static Singleton instance = new Singleton();

すなわち。上記のコードで宣言中にオブジェクトを初期化します。

その場合、getInstance() メソッドで synchronized を使用する必要はありません。心配しないでください。まだシングルトンは 100% の保証で実装されています。

これを行うだけです:

 public static Singleton getInstance() {
        return instance;
    }

Final keyword will just make sure that the class can Not be extended..それでおしまい..It Will Not effect the singleton pattern.

Double Check Lockingを使用してシングルトン パターンを実装することもできます。Please refer HEAD FIRST DESIGN PATTERN

于 2012-06-08T18:31:30.153 に答える
1

シングルトンを作成するときは、必ずパターンを強制しようとします。つまり、シングルトン クラスの 2 番目のインスタンスを作成する方法はまったくないはずです。

プライベート コンストラクターを宣言することで、他の最上位クラスがシングルトン クラスを拡張できないようにしますが、内部クラスはそれを囲むクラスのプライベート メンバーにアクセスできるため、内部クラスまたは静的内部クラスがそれを拡張してシングルトンを壊す可能性があります。

明らかに、これは本当に望んでいない限り起こり得ませんが、シングルトンを防弾にしたい場合は、それを final と宣言すれば、パターンが壊れることをあらゆる手段で防ぐことができます。

于 2012-06-08T18:34:11.197 に答える
0

いいえ。クラスはすでにシングルトン パターンです。Final 修飾子はクラスを派生不可にしますが、プライベート コンストラクターがあるため既に派生不可です。

于 2012-06-08T18:26:16.003 に答える