2012-01-20 2 views
2

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

Они смотрют что-то вроде:

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 создается. Но есть ли способ, чтобы каждый из них правильно ссылался на другого? Я рассматриваю возможность создания двух одноэлементных хэшмапов, которые искусственно перекрестно ссылаются на два, но есть ли лучшая идея?

+0

счетчиков? Конструкторы с конструкторами для другого? Нет счетчиков, а ctors не имеют «ctors», они устанавливают переменную экземпляра, которая ссылается на другую. Вы не показываете, где вы их создаете, но если каждый из них является одним синглом с ссылкой на другой, может потребоваться переосмыслить дизайн - какова фактическая связь между ними? –

+0

Я не хотел сказать, что каждый конструктор имеет конструктор; Я хотел сказать, что каждый конструктор имеет параметр. – Robert

ответ

1

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

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

Хммм, я пробовал это и, похоже, работает. Я предполагаю, что это избегает округлости моих первоначальных конструкторов. Благодаря! – Robert

2

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

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()); 
+0

Спасибо, я тоже думал об этом. Вероятно, это было бы лучше, чем моя идея hashmap Singleton. – Robert

0
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(); 
} 
Смежные вопросы