2014-11-26 1 views
1

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

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

EDIT

Из ответов я собранными, и некоторые дополнительные исследования, это был класс, который я закончил:

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

Насколько мне известно, вам не нужен синглтон, так как вы (скорее всего) не будете иметь одновременно два приложения. – guness

+0

«Приложение» * IS * singleton - есть только один экземпляр. Кроме того, не расширяйте 'Application', чтобы делать что-то столь же тривиальное, как получение шрифтов. – Squonk

+0

@Squonk Итак, каковы критерии? Я думал, что с тех пор, и я действительно не знаю, почему Android только позволяет нам изменить шрифт программно, и поскольку я использую много «setTypeFace», это было бы хорошее место для хранения в качестве глобальной переменной. – Bernardo

ответ

2

Цель одноплодного шаблон для обеспечения, что только один экземпляр класса может быть создан , На самом деле вы этого не добиваетесь. Правильный способ сделать это в Java состоит в том, чтобы сделать конструктор закрытым, а затем установить статическую переменную в экземпляр singleton класса. Например:

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.

+0

О, хорошо ... теперь это имеет смысл. Мой код - это группа различных поисковых запросов Google, но я видел много getInstances, которые никогда не использовались. Хотелось бы знать, почему. Но большое спасибо за объяснение, это имеет смысл :) – Bernardo

1

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

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