2013-09-19 4 views
4

Я использую Gson для десериализации Json в модель ApplicationModel. Я хочу, чтобы эта модель была одиночной, поэтому я могу получить доступ к ней в другом месте приложения.Использование Gson для десериализации Json в singleton

Теперь, когда Gson создает экземпляр этого класса, я создаю экземпляр singleton довольно нетрадиционным способом. Смотрите ниже:

public class ApplicationModel { 

    private static ApplicationModel instance; 

    private GeneralVO general; 

    protected ApplicationModel() { 
     instance = this; 
    } 

    public static ApplicationModel getInstance() { 
     return instance; 
    } 

    public String getVersionDate() { 
     return general.getVersionDate(); 
    } 
} 

Это способ создать его, а затем использовать его позже в применении:

InputStreamReader reader = new InputStreamReader(is); 
ApplicationModel model1 = new Gson().fromJson(reader,ApplicationModel.class); 

Log.i("MYTAG", "InputStream1 = "+model1.toString()); 
Log.i("MYTAG", "Date: "+model1.getVersionDate()); 
ApplicationModel model2 = ApplicationModel.getInstance(); 
Log.i("MYTAG", "InputStream1 = "+model2.toString()); 
Log.i("MYTAG", "Date: "+model2.getVersionDate()); 

Это работает как getInstance() возвращает ту же модель, но так или иначе это просто не кажется правильно.

Мой вопрос: «Это хороший способ обойти это или есть лучшее решение?»

EDIT

Намного лучше делать одиночка, чтобы использовать перечисление с одним INSTANCE элемента.

See this post for an explanation

ответ

1

Я предлагаю создать экземпляр одноэлементный экземпляр на вашей модели, а не инстанцировании его с помощью конструктора.

public class ApplicationModel { 

    private static ApplicationModel instance; //= new ApplicationModel(); 
    //instantiating here is called an "Eagerly Instantiated" 

    private GeneralVO general; 

    private ApplicationModel() { 
    } 

    public static ApplicationModel getInstance() { 
     //instantiating here is called "Lazily Instantiated", using : 
     //if (instance==null) {     --> Check whether 'instance' is instantiated, or null 
     // instance = new ApplicationModel(); --> Instantiate if null 
     //} 
     return instance; //return the single static instance 
    } 

    public String getVersionDate() { 
     return general.getVersionDate(); 
    } 
} 

Установив конструктор в частном порядке, вы предотвратите объект от повторного экземпляра другого класса, использовать объект, вы должны вызвать объект с ApplicationModel.getInstance().

Итак, если вы хотите установить значения, позвоните по телефону ApplicationModel.getInstance().setterMethod(value), зачем это полезно? если вы хотите отслеживать изменение, вам нужно будет только отслеживать метод setter. Если вы использовали конструкторы, вам также придется отслеживать конструкторы.

Пример:

// To SET the value: 
// instead of ApplicationModel model1 = new Gson().fromJson(reader,ApplicationModel.class); 
ApplicationModel.getInstance.setValue(new Gson().fromJson(reader,ApplicationModel.class); 

// To GET the value : 
ApplicationModel.getInstance.getValue(); 

«Нетерпеливое Инстанцирование» против «Ленивого Инстанцирования»:

  • Нетерпеливого Инстанцирование полезно, если вы хотите простой способ иметь дело с Темой
  • Ленивого Инстанцирования имеет лучшие следы памяти

Ther e больше, чем это, вы можете google для получения дополнительной информации, но я думаю, что этого вам будет достаточно сейчас.

Надеется, что это помогает, и удач ^^

С уважением,

Reid

+3

Я не уверен, что это отвечает на вопрос точно. Поскольку GSON использует отражение, он возвращает экземпляр класса. Если бы я хотел 'getInstance()' мне понадобится 'setInstance (новый Gson(). FromJson (reader, ApplicationModel.class))', если я читаю вас правильно, это откроет возможность изменить экземпляр singleton. Это делает этот подход открытым для потенциальной ошибки?Если пользователь по какой-то причине устанавливает экземпляр на что-то еще, по какой-то причине синглтон внезапно становится чем-то новым. Я остался с моей первоначальной реализацией, так как это предотвращает потенциальные внешние вмешательства ... –

Смежные вопросы