1

アプリケーション内で使用するさまざまな書体を保存するために、Android アプリでアプリケーションを拡張しました。すべて正常に動作していますが、コードのシングルトン部分と getInstance の目的を理解していません (そこにブレークポイントを設定しましたが、呼び出されません。また、メソッドの名前を変更すると、アプリケーションは正常に動作します良い)。誰かがこのパターンについて教えてくれますか? 私は通常 OOP を使用しないので、ばかげた質問かもしれません。

MyApplication.java

    public class MyApplication extends Application {
    private Typeface _typefaceNormal;
    private Typeface _typefaceBold;

    private static MyApplication singleton;

    public MyApplication getInstance() {
        return singleton;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
        this._typefaceNormal = Typeface.createFromAsset(getAssets(),"PTS55F.TTF");
        this._typefaceBold = Typeface.createFromAsset(getAssets(), "PTS75F.TTF");
    }

    public Typeface getNormalFont() {
        return this._typefaceNormal;
        // return this._typefaceNormal;
    }

    public Typeface getBoldFont() {
        return this._typefaceBold;
        // return this._typefaceBold;
    }
}

そして、次のように呼び出します。

this._typeface = ((MyApplication) _activity.getApplicationContext()).getNormalFont();

編集

私が集めた答えといくつかの追加の調査から、これは私が最終的に使用したクラスでした:

    public class MyGlobalConfig {
    private static MyGlobalConfig singleton;
    private Typeface _typefaceNormal;
    private Typeface _typefaceBold;

    private MyGlobalConfig() {

    }

    public static MyGlobalConfig getInstance() {
        if (singleton == null) {
            singleton = new MyGlobalConfig();
        }
        return singleton;
    }

    public void init(Context ctx, String typefaceNormal, String typefaceBold) {
        this._typefaceNormal = Typeface.createFromAsset(ctx.getAssets(),
                typefaceNormal);
        this._typefaceBold = Typeface.createFromAsset(ctx.getAssets(),
                typefaceBold);
    }

    public Typeface getNormalFont() {
        return this._typefaceNormal;
        // return this._typefaceNormal;
    }

    public Typeface getBoldFont() {
        return this._typefaceBold;
        // return this._typefaceBold;
    }
}

次のように初期化します。

MyGlobalConfig.getInstance().init(getApplicationContext(), normalFont, boldFont);

そして、私のフォントを次のように設定します:

MyGlobalConfig.getInstance().getNormalFont();
4

2 に答える 2

2

シングルトン パターンの目的は、クラスのインスタンスを 1 つだけ作成できるようにすることです。ただし、ここでは実際には達成できません。Java でこれを行う適切な方法は、コンストラクターをプライベートにしてから、静的変数をクラスのシングルトン インスタンスに設定することです。例えば:

public class MySingletonClass{
  private static MySingletonClass singleton;

  // private constructor
  private MySingletonClass(){}

  public static MySingletonClass getInstance(){
   if(singleton == null){
     singleton = new MySingletonClass();
   }
   return singleton;
  }
}

Android での作業に関しては、Application クラスをシングルトンにする必要はありません。Android はそのインスタンスを 1 つだけ作成し、管理します。また、Application クラスには既に public コンストラクターが定義されているため、コンパイラーが拡張クラスでコンストラクターを非公開にすることを許可するとは思わないため、シングルトン パターンを強制できませんでした。

于 2014-11-26T18:43:44.173 に答える
1

これは、静的メソッド MyApplication.getInstance() を使用していないためです。代わりに、 context.getApplicationContext() を介して参照にアクセスしています。この場合、「シングルトン」静的変数と同じ参照になります。

静的メソッド getInstance() を介してインスタンスにアクセスすると、コンテキスト参照なしでインスタンスにアクセスできるようになり、キャスト ((MyApplication) _activity.getApplicationContext()) を省くことができます。悪い面としては、コードが結合され、テストしにくくなります。

于 2014-11-26T18:58:16.003 に答える