0

これは、マルチスレッド アプリで使用するために、常にスレッド セーフなシングルトンを作成する方法です。

public class Logger {

    private Logger() {}

    private static Logger instance = new Logger();

    public static Logger getInstance() {
        return instance;
    }

    public void log(String s) {
        // Log here
    }
}

今日、私は Java 認定資格を取得するために勉強していましたが、本で次の別の解決策を見つけました。

public class Logger {

    private Logger() {}

    private static Logger instance;

    private static class LoggerHolder {
        public static Logger logger = new Logger();
    }

    public static Logger getInstance() {
        return LoggerHolder.logger;
    }

    public void log(String s) {
        // Log here
    }
}

彼らはもう一方については言及していません。

何が良いですか?そして、2つのソリューションの違いは何ですか?

4

2 に答える 2

1

2 番目の例では、クラスにアクセスしたという理由だけでインスタンスが作成される可能性は低くなります。代わりに、内部クラスにアクセスする必要があります。このレベルのパラノイアは、JDK ライブラリの設計者にとっては理にかなっていますが、より制御されたコード ベースでは、私見では度を越しています。

私はシンプルさを好み、代わりにこれを使用します

public enum MyLogger {
    INSTANCE;

    public void log(String s) {
       // log here
    }
}

という名前のクラスを作成しないことを強くお勧めしLoggerます。1 つのビルトインを含む、このクラスの多くの実装については、すでに十分な混乱があります。

于 2013-05-11T21:41:32.697 に答える
0

2番目は怠け者です。奇跡的に、プログラムがクラスをロードしても を呼び出さないgetInstance()場合、ロガー インスタンス (作成するのにコストがかかるオブジェクトである可能性があります) は作成されません。

率直に言って、シングルトンが本当に必要な場合 (依存性注入フレームワークではほとんどの場合必要ありません)、私は理解しやすい最初のソリューションを好みます。クラスがロードされているが、実際のコードでは使用されていないシングルトンを見たことがあったとしても、めったにありません。

于 2013-05-11T21:43:02.517 に答える