2015-07-03 3 views
0

Я начал изучать Android с помощью Android Big Nerd Ranch. Листинг 9.1 Настройка синглтона (CrimeLab.java)Singleton and Context

public class CrimeLab { 
    private static CrimeLab sCrimeLab; 
    private Context mAppContext; 

    private CrimeLab(Context appContext) { 
     mAppContext = appContext; 
    } 

    public static CrimeLab get(Context c) { 
     if (sCrimeLab == null) { 
      sCrimeLab = new CrimeLab(c.getApplicationContext()); 
     } 
     return sCrimeLab; 
    } 
} 

Project- мы создаем список объектов преступлений, и мы использовали этот класс для хранения списка.

У меня возникли проблемы с пониманием необходимости класса Singleton, приведенного в листинге 9.1. Зачем нам этот класс в первую очередь? и зачем нужна переменная контекста и что она удерживает?

Я искал google и узнал, что этот контекст используется для информирования о том, что происходит с другими частями приложения. Однако я не совсем понял, о чем мы сообщаем CrimeLab? Можем ли мы создать crimeLab без одноэлементного класса? если да, почему мы использовали crimeLab как одноэлементный класс?

ответ

0

Это не проблема Android, это всего лишь шаблон дизайна. Я читал этот пример в руководстве Android Big Nerd Ranch. Листинг 9.1. Настройка Singleton (CrimeLab.java) и причина его использования в singleton была описана нами, мы хотим сохранить данные , общие данные. Пусть себе представить, что когда мы строим объект CrimeLab без одноэлементных в 2-х местах:

CrimeLab cb1 = new CrimeLab(context); 
CrimeLab cb2 = new CrimeLab(context); 

создает новые объекты и сохраненные данные в CB1 и CB2 различны.

Представьтесь, что вы используете базу данных в приложении, это должно быть только одно? Да.

Но цель той же цели (единственное место данных), мы можем использовать статические методы или свойства, но необходимо, чтобы предотвратить создание объекта, скрыв конструктор

private CrimeLab(Context appContext) { 
    mAppContext = appContext; 
} 
+0

Oh! и нам нужен контекст, чтобы сообщить приложению, что произошло, чтобы все данные аккуратно накапливались в одном месте. Я прав? Большое спасибо –

+0

Нет, нам просто нужен контекст здесь, если мы * нуждаемся в его информации для объекта CrimeLab. В противном случае вы можете удалить его, поскольку это сам параметр. Данные находятся в одном месте только из-за применения singleton (статическое свойство): private static CrimeLab sCrimeLab; –

0

Одноэлемент - это класс, из которого только когда-либо будет один экземпляр. Следовательно, создается частный конструктор и public static.

Публичный статический get часто бывает без параметров. И причина в том, что если он вызывается с разными параметрами, то порядок вызова вызовет инициализацию синглтона по-разному, поэтому вы склонны к условиям гонки.

Без дополнительного контекста я могу заключить, что такой код плохой.