2

先日シングルトンについて読んでいて、自分のプロジェクトに実装しようと思ったのですが、論理的に流れているように見えるのが気に入らなかったので、コントローラークラスと呼ばれるものを作成して、状態を管理しましたシングルトン オブジェクト。ただし、ロジックがチェックアウトされていること、および誤って追加のインスタンスを生成していないことを確認したいと考えています。

//Controller for SaveSystem, allows the class to be created once for the 
//duration of the application at the global level (believe this is called a 
//singleton pattern)

public class SaveSystemContr {
  private static SaveSystem saveSystemInstance;
  public SaveSystem GetSaveSystemData() {
    return saveSystemInstance;
  }

  public void SetSaveSystem(SaveSystem _saveSystem) {
    if(saveSystemInstance!=null) {
        saveSystemInstance=_saveSystem;
    }
  }

  public static SaveSystem getSaveSystemInstance(final FirebaseAuth _auth, final LoadProjFragment _LFP) {
    if(saveSystemInstance==null) {
        saveSystemInstance = new SaveSystem(_auth, _LFP);
    }

    return saveSystemInstance;
  }

  public SaveSystemContr() {} //THE WAY IS SHUT!
}

編集*これは、参照されている質問の複製とは見なされません。これは、シングルトンの典型的/標準的な実装であり、コントローラーを使用してシングルトンの状態を管理することにより、まったく異なるモデルを使用します。

4

2 に答える 2

1

ただし、ロジックがチェックアウトされていること、および誤って追加のインスタンスを生成していないことを確認したいと考えています。

必要な数のインスタンスを作成できるようです。

SaveSystemContr controller = new SaveSystemContr();

// Create instance 1
controller.SetSaveSystem(new SaveSystem(auth, lfp));

// Create instance 2
controller.SetSaveSystem(new SaveSystem(auth, lfp));

// ...

インスタンスが 1 つだけ必要な場合、なぜセッター メソッドがあるのですか?

非常に基本的なシングルトンは次のようになります。

public final class SaveSystemSingleton {
  // This class should only be accessed statically. Don't allow instance creation
  private SaveSystemSingelton() {}

  private static SaveSystem saveSystem;

  // Encapsulate creation logic. Passing in params is misleading because
  // all subsequent calls will do nothing with the params.
  public static SaveSystem get() {
    // If accessing from multiple threads do Double Check Locking instead!
    if (saveSystem == null) {
      saveSystem = new SaveSystem(new FirebaseAuth(), new LoadProjFragment());
    }
    return saveSystem;
  }
}

本当にパラメーターを渡す必要がある場合は、別の静的セッター メソッドを定義し、複数回呼び出された場合、またはget()最初にセッターを呼び出さずに が呼び出された場合に例外をスローします。

また、依存性注入 (例: Dagger2 ) も確認してください。これにより、オブジェクトのインスタンスを作成し、それらのスコープを明確かつ簡単に設定できます。

于 2018-02-03T04:59:50.477 に答える