Перечисления, которые ссылаются друг на друга, дают разные результаты в зависимости от названного порядка - PullRequest
2 голосов
/ 20 января 2012

У меня есть два перечисления, которые пересекаются друг с другом. У каждого есть конструктор, у которого есть параметр для другого перечисления.

Они выглядят примерно так:

SchoolEnum(ImmuneEnum value)
{
   this.immune = value;
}

ImmuneEnum(SchoolEnum value)
{
   this.school = value;
}

Однако, в зависимости от того, какой Enum я вызываю первым, я могу получить нулевое значение для ссылочной переменной.

ImmunityEnum immune = ImmunityEnum.IMMUNE_KANNIC; 
SchoolEnum school = SchoolEnum.KANNIC;
System.out.println(school.getImmune())
System.out.println(immune.getSchool());

Производит вывод: ноль Kannic

SchoolEnum school = SchoolEnum.KANNIC;
ImmunityEnum immune = ImmunityEnum.IMMUNE_KANNIC; 
System.out.println(school.getImmune())
System.out.println(immune.getSchool());

Производит вывод: immunekannic нуль

Кажется, это немного "проблема курицы и яйца" в том, когда создается экземпляр enum. Но есть ли способ, чтобы каждый из них правильно ссылался на другой? Я рассматриваю возможность создания двух одноэлементных хэш-карт, которые искусственно пересекаются с этими двумя, но есть ли лучшая идея?

Ответы [ 3 ]

2 голосов
/ 20 января 2012

Это не самое красивое решение в мире, но как насчет установки перекрестных ссылок впоследствии ?:

enum SchoolEnum {
    KANNIC;
    private ImmunityEnum immune;
    public ImmunityEnum getImmune() {
        return immune;
    }
    public void setImmune(ImmunityEnum immune) {
        this.immune = immune;
    }
}

enum ImmunityEnum {
    IMMUNE_KANNIC;
    private SchoolEnum school;
    public SchoolEnum getSchool() {
        return school;
    }
    public void setSchool(SchoolEnum school) {
        this.school = school;
    }
}

Теперь используйте это так:

SchoolEnum school = SchoolEnum.KANNIC;
school.setImmune(ImmunityEnum.IMMUNE_KANNIC);
ImmunityEnum immune = ImmunityEnum.IMMUNE_KANNIC; 
immune.setSchool(SchoolEnum.KANNIC);

System.out.println(school.getImmune());
System.out.println(immune.getSchool());
1 голос
/ 20 января 2012

Что делать, если вы передаете параметры String в свои конструкторы:

public enum SchoolEnum {
   Kannic("immnunekannic");
   private String immune;
   public SchoolEnum (String immune) {this.immune = immune;}
   public ImmuneEnum getImmune() {
       return ImmuneEnum.valueOf(immune);
   }
}

public enum ImmnueEnum {
   immunekannic("Kannic");
   private String scholl;
   public ImmnueEnum (String school) {this.school = school;}
   public SchoolEnum getSchool() {
       return SchoolEnum.valueOf(school);
   }
}

Но, честно говоря, немного странно создавать модель этого типа домена.Какой у вас сценарий использования?

0 голосов
/ 30 мая 2013
public enum SchoolEnum  {
  KANNIC {

    @Override
    public ImmunityEnum  getImmune() {
      return ImmunityEnum.IMMUNE_KANNIC;
    }
  };

  public abstract ImmunityEnum getImmune();
}

public enum ImmunityEnum {
  IMMUNE_KANNIC {

    @Override    
    public SchoolEnum getSchool() {
      return SchoolEnum.KANNIC;
    }
  };

  public abstract SchoolEnum getSchool();
}
...