Переменная enum считается нулевой, если она не установлена ​​таким образом - PullRequest
0 голосов
/ 28 марта 2019

Всякий раз, когда я пытаюсь получить поле из перечисления, оно всегда возвращает ноль. Я установил значение в соответствии с конструктором enum. Это все еще выходит ноль.

public enum TeamType {
    RED("Red",ChatColor.RED,DyeColor.RED,Point.RED),
    BLUE("Blue",ChatColor.BLUE,DyeColor.BLUE,Point.BLUE);  //<----Set as Point.RED/BLUE



    private String name;
    private int crystalHealth = 50;
    private Point point;
    private int teamPoints;
    private ChatColor chatColor;
    private DyeColor dye;
    private HashSet<ArenaPlayer> playerList = new HashSet<>();
    private List<ArenaPlayer> queue = new ArrayList<ArenaPlayer>();
    private Location spawn;


    public Point getPoint()
    {
        if(point == null)
            System.out.println("WHY? for: " + this.toString()); //<---This always runs

        return point;
    }

    private TeamType(String name,ChatColor color,DyeColor dye,Point point1) {
        this.name = name;
        this.point = point1; // <--- My assignment
        this.dye = dye;
        this.chatColor = color;
    }

Точка перечисления класса

public enum Point{
    RED(ChatColor.RED + "Red",TeamType.RED),
    BLUE(ChatColor.BLUE + "Blue",TeamType.BLUE),
    NEUTRAL(ChatColor.WHITE +"None",null);

    private String name;
    private TeamType teamOwned;
    private Point(String name,TeamType team) {
        this.name = name;
        teamOwned = team;
    }

    public TeamType getTeamOwned() {
        return teamOwned;
    }

     public String getName() {
        return name;
    }

     @Override
    public String toString() {
        return name;
    }

Очевидно, что-то происходит за пределами моего знания Java. Возможно ли, что Point Enum еще не инициализирован, когда перечисление TeamType есть. Это может объяснить, почему это ноль.

Мне нужна помощь.

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Ну, я думаю, что источник проблемы в том, что у вас есть круговая ссылка.TeamType имеет ссылку Point и наоборот.

Предположим, что класс перечисления TeamType инициализирован, а затем константы перечисления также инициализированы.Они относятся к Point, который в свою очередь инициализируется.Загрузчик классов загружает класс Point, но не инициализирует TeamType снова.На данный момент свойства, которые вы ожидаете, чтобы быть ненулевым, по-прежнему равны нулю.


JLS § 12.4 определяет этот процесс.

0 голосов
/ 28 марта 2019

Предположим, у нас есть класс с именем A, который имеет объект класса B. (в терминах UML A HAS B). в то же время наш класс B также состоит из Объекта класса A (в терминах UML B HAS A). очевидно, это представляет круговую зависимость, потому что при создании объекта A компилятор должен знать размер B ... с другой стороны, при создании объекта B компилятор должен знать размер A. это что-то вроде яйца против курица проблема ...

, чтобы избежать такого типа циклической зависимости, вы можете использовать любой прокси-интерфейс.

https://dzone.com/articles/tackling-circular-dependency

...