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 ()). С другой стороны, он связывает ваш код и делает его менее тестируемым.