Объясните для чего в классе объявляется переменная этого же класса?

250
03 декабря 2017, 13:04

Объясните для чего в классе объявляется переменная этого же класса?

public class Person {
    static Person personInner;
    String name, age;
    private Person(String name, String age) {
        this.name = name;
        this.age = age;
    }
    public static Person getInstance(String name, String age){
        if (personInner == null){
            personInner = new Person(name, age);
        }
        return personInner;
    }
    public String getName() {
        return name;
    }
    public String getAge() {
        return age;
    }
}
Answer 1

Хороший вопрос, логика данного кода

  1. Если getInstance вызывался в первый раз, объект Person создается с нужным именем и возрастом,
  2. При вызовах getInstance во второй и следующий раз, возвращается объект Person созданный в первый раз, а имя и возраст игнорируются.

Это классический паттерн Сингелтон (или одиночка). Правда в данном случае это выглядит как ошибка. Так как это плохой дизайн, когда имя и возраст у getInstance просто игнорируются, получается пользователь API запрашивает определенный данные, а ему возвращается что-то не связанное с тем именем и возрастом, который он запросил. Получается что мы всегда работает с одним человеком, созданным первым. Можно было бы это понять если в getInstance менялись имя и возраст - это было бы переиспользование ненужного объекта (хотя такое тоже редко).

P.S. Так же странным решением выглядят не приватные внутренние поля, я бы сделал

private static Person personInner;
private String name;
private String age;

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

А откуда код взят? Вы уверены, что он действительно делает то что и задумалось?

READ ALSO
Операторы сдвига и побитовое НЕ JAVA

Операторы сдвига и побитовое НЕ JAVA

Опыты ставились над переменной int numberК двоичному виду приводил при помощи Integer

233
Как сохранить строковый массив?

Как сохранить строковый массив?

Пусть у меня есть массив testКак мне сделать так, чтобы он сохранялся в sharedPreferences при выходе из программы и загружался при входе?

202