Android расширяет приложение шаблонов сомнений

Я расширил свое приложение в своем приложении для Android, чтобы хранить различные шрифты, которые я использую в своем приложении. Все работает нормально, однако я не понимаю единственную часть кода и какова цель getInstance (я установил там точку останова, и она никогда не вызывается, также, если я изменяю имя метода, приложение отлично работает как Что ж). Может ли кто-нибудь просветить меня об этом шаблоне? Я обычно не работаю с ООП, так что это может быть глупым вопросом.

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();

2 ответа

Решение

Цель одноэлементного шаблона состоит в том, чтобы обеспечить создание только одного экземпляра класса. Вы действительно не достигаете этого здесь все же. Правильный способ сделать это в 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, нет необходимости делать ваш класс приложения синглтоном. Android будет создавать только один его экземпляр и управлять им за вас. Кроме того, поскольку в классе Application уже определен общедоступный конструктор, я не верю, что компилятор позволит вам сделать конструктор частным в вашем расширенном классе, поэтому вы не можете применить шаблон singleton.

Это потому, что вы не используете статический метод MyApplication.getInstance (). Вместо этого вы обращаетесь к ссылке через context.getApplicationContext (), которая в этом случае приводит к той же ссылке, что и статическая переменная "singleton".

Доступ к экземпляру через статический метод getInstance () дает вам возможность получить к нему доступ без ссылки на контекст и избавить вас от приведения ((MyApplication) _activity.getApplicationContext ()). С другой стороны, он связывает ваш код и делает его менее тестируемым.

Другие вопросы по тегам