У вас круговая зависимость: инициализация перечисления CARDS
и экземпляра MyClass
зависят друг от друга.
CARDS
конструктор создает экземпляр MyClass
, но конструктор MyClass
полагается на CARDS.SPADE
состояние, которое еще не полностью инициализировано, как в ожидающем конструкторе перечисления.
Либо прервите этот цикл, либо сделайте что-нибудь два раза.Инициируйте перечисление без двунаправленного отношения и после вызовов конструктора установите значение перечисления на экземпляр MyClass
через установщик.
Обратите внимание, что "настоящая" причина NullPointerException
заключается в том, что вы не ссылаетесь на текущий экземпляр, созданный в конструкторе enum (this
), но ссылаетесь на значение enum из самого класса enum: MyClass.CARD.SPADE
.
Первый имеет состояние, а второй еще нет, поскольку конструктор enum еще не вернулся.
Передав экземпляр enum в конструктор MyClass
, он будет «работать»:
CARDS(String color){
this.cardColor = color;
obj = new MyClass(this);
}
}
// ...
public MyClass(CARDS cards){
cardColor = cards.cardColor;
}
Но в общем случае передача this
во время тела конструктора другому объекту /класс не очень хорошая идеяЭто может просочиться в несогласованное состояние, если состояния объекта изменяются между этим временем и окончанием вызова конструктора.