Как убедиться, что инициализируется только один экземпляр, но из другого класса? - PullRequest
0 голосов
/ 22 мая 2018

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

public class Player {

    String name;
    Position p;
    Inventory i;

    private Player(String name, Position p, Inventory i){

    }

    static {
        instance = 
    }

    public static Player getPlayer(){
        return instance;
    }

}

Ответы [ 4 ]

0 голосов
/ 22 мая 2018

По сути, при таком подходе вы скрываете конструктор (private) и выставляете статический метод для получения instance.В методе, который вы проверяете, если instance если null, если это так, вы инициализируете его с предоставленными аргументами.

Наконец, вы возвращаете instance.

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

public class Player {

    String name;
    Position p;
    Inventory i;

    private static Player instance;

    private Player(String name, Position p, Inventory i){
        // ...
    }

    public static Player getPlayer(String name, Position p, Inventory i){
        if (instance == null) {
            instance = new Player(name, p, i);
        }
        return instance;
    }

}

Кроме того, если вы хотите правильно использовать шаблон синглтона, вы не должны устанавливать атрибуты (без методов установки) после создания экземпляра.

0 голосов
/ 22 мая 2018

В другом классе вы звоните: Player.getPlayer()

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

Единственный способ получить ваш экземпляр Player - через статический метод Player.getPlayer(), следовательно, он одноэлементный.

public class Player {

    String name;
    Position p;
    Inventory i;


    private static final Player instance = new Player(.....your argument....);

    private Player(String name, Position p, Inventory i){

    } 

    public static Player getPlayer(){
        return instance;
    }

}
0 голосов
/ 22 мая 2018

Просто объявите приватное статическое конечное поле INSTANCE как

private static final INSTANCE = new Person(name, p, i);
0 голосов
/ 22 мая 2018

Вы должны создать переменную private static Player, а в вашем методе getPlayer() или в статическом блоке создать объект и назначить вышеуказанную переменную, если она равна нулю.

public static Player getPlayer(){
    if(player == null){
        player = new Player("name", p, i);
    }
    return player;
}

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


Простые правила,

  1. Конструктор класса должен быть private.
  2. Хранить объект в private static variable.
  3. Создать метод получения для одноэлементного объекта (без методов установки).
  4. Вы также можете добавить synchronized в метод получения, чтобы сделать его потокобезопасным (необязательно).
...