Как происходит обращение к методу через переменную?
Есть строки:
CrimeLab crimeLab = CrimeLab.get(this);
mCrimes = crimeLab.getCrimes();
Есть класс:
public class CrimeLab {
private static CrimeLab sCrimeLab;
private List<Crime> mCrimes;
public static CrimeLab get(Context context) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(context);
}
return sCrimeLab;
}
private CrimeLab(Context context) {
mCrimes = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Crime crime = new Crime();
crime.setTitle("Crime #" + i);
crime.setSolved(i % 2 == 0);
mCrimes.add(crime);
}
}
public List<Crime> getCrimes() {
return mCrimes;
}
public Crime getCrime(UUID id) {
for (Crime crime : mCrimes) {
if (crime.getId().equals(id)) {
return crime;
}
}
return null;
}
}
В данном случае я не очень понимаю принцип вызова метода getCrimes(), так как вызвать его с помощью класса CrimeLab.getCrime() нельзя, ибо метод не статический, вызвать с помощью ссылки new CrimeLab.getCrime() тоже нельзя, так как класс CrimeLab имеет только приватный конструктор.
Почему тогда этот метод можно вызвать с помощью переменной crimeLab?
Ответы (1 шт):
Метод нельзя вызвать с помощью new CrimeLab.getCrime() не из-за каких-то ограничений метода, а потому, что нельзя вызвать саму строку new CrimeLab.getCrime().
Зачем так делать?
Почему приватный конструктор:
Это учебный пример, в реальности Вы не будете генерировать данные при создании
CrimeLab, Вы будете читать их из файла/БД/сети/ввода пользователя с другого экрана.Вам будет необходимо гарантировать, что данные одинаковы для всех экранов. //причина, по которой конструктор сделан приватным
Итак, мы имеем класс, у которого приватный конструктор, поэтому
new CrimeLab.getCrime()уже не работает.Почему не статический метод?
Вам нужно минимизировать число долгих операций (получаете данные в конструкторе и больше никогда, конструктор вызывается один раз).
То есть, если Вы сделаете просто статический метод, то каждый раз будете обращаться, например, в сеть, что может занимать секунды времени. Пользователи не любят, когда все работает так медленно.
Итак, мы приходим к выводу, что статический метод не подходит. (потому он и не сделан в книге статическим)
Остается только тот вариант, который у Вас в вопросе. Всё в целом это называется паттерн Singleton.
Если что-то осталось непонятно после моего объяснения - поищите в интернете, паттерн очень старый, про него много всего есть в книгах/статьях.