2016-10-05 6 views
2

Я хочу сделать перечисление страны, из которого я могу получить доступ к ее состояниям, как я могу это сделать?Есть ли что-то вроде вложенных перечислений в Java?

Что-то вроде этого:

public enum SomeEnum { 

    ARGENTINA { 
     BUENOS_AIRES; 
    } 

    UNITED_STATES { 
     CALIFORNIA, FLORIDA, NEW_YORK, ALASKA; 
    } 

} 

SomeEnum state1 = SomeEnum.ARGENTINA.BUENOS_AIRES 
SomeEnum state2 = SomeEnum.UNITED_STATES.CALIFORNIA; 
+2

Что именно вы пытаетесь достичь? ?? –

ответ

2

Вы можете использовать интерфейс как

interface Country { 
    Country USA = Americas.USA; 

    enum Asia implements Country { 
     Indian, 
     China, 
     SriLanka 
    } 
    enum Americas implements Country { 
     USA, 
     Brazil 
    } 
    enum Europe implements Country { 
     UK, 
     Ireland, 
     France 
    } 
} 

и вы можете иметь

Country c = Country.USA; 
c = Country.Asia.China; 
3

Вы не назначить вложенную перечисление его родителя как

SomeEnum state1 = SomeEnum.ARGENTINA.BUENOS_AIRES 

Что вы можете сделать, это

class Test { 
    SomeEnum someEnum = SomeEnum.SRILANKA; 
    SomeEnum.UNITED_STATES us = SomeEnum.UNITED_STATES.CALIFORNIA; 
    SomeEnum.ARGENTINA argentina = SomeEnum.ARGENTINA.BUENOS_AIRES; 
} 

enum SomeEnum { 
    SRILANKA; 

    enum ARGENTINA { 
     BUENOS_AIRES; 
    } 

    enum UNITED_STATES { 
     CALIFORNIA, FLORIDA, NEW_YORK, ALASKA; 
    } 
} 

Вот вам не могут назначать UNITED_STATES и ARGENTINA до типа SomeEnum

+0

В зависимости от требований, дизайн может быть разработан. Например, если вы хотите назначить какое-либо государство из какой-либо страны переменной myState, вы можете объявить интерфейс 'Interface State {}' и использовать внутренние перечисления ('enum ARGENTINA реализует State ...') , поэтому 'State myState = SomeEnum.ARGENTINA.BUENOS_AIRES;' будет работать. –

+1

Они могли бы реализовать один и тот же интерфейс интерфейса –

0

@Thusitha Thilina Dayaratne пример был идеальным! Но если вы все же хотите использовать то же самое время, как вы упомянули:

SomeEnum State1 = SomeEnum.ARGENTINA.BUENOS_AIRES SomeEnum State2 = SomeEnum.UNITED_STATES.CALIFORNIA;

Тогда просто сделать так:

Object state1, state2, state3; 

    state1 = SomeEnum.UNITED_STATES.CALIFORNIA; 
    state2 = SomeEnum.ARGENTINA.BUENOS_AIRES; 
    state3 = SomeEnum.SRILANKA; 

    System.out.println(state1); 
    System.out.println(state2); 
    System.out.println(state3); 

И вы получите то, что именно вы хотели!

+1

«что именно вы хотели» - кроме типа безопасности :-) –

+0

Да! Свобода LOL !!! –

1

Предлагаю вам найти другой подход к достижению этого. Если вы можете придумать способ «вложенности» состояний в странах, тогда у вас будет проблема не иметь одного типа для всех состояний. Вы не сможете использовать переменную state, которой может быть присвоено состояние США или штата Аргентина.

Вот альтернативная модель вы можете рассмотреть следующие вопросы:

public interface State { 
} 

private enum UnitedStates implements State { 
    CALIFORNIA, ...; 
} 

private enum ArgentinaStates implements State { 
    BUENOS_AIRES, ...; 
} 

public enum Country { 
     SRILANKA(), 
     US(UnitedStates.values()), 
     ARGENTINA(ArgentinaStates.values()); 

    Country(State... states) { 
     this.states = Arrays.toList(states); 
    } 

    private final List<State> states; 

    public List<State> getStates() { 
     return states; 
    } 
} 

Тогда вы можете сделать:

State state; 
state = ArgentinaStates.BUENOS_AIRES; 
state = UnitedStates.CALIFORNIA;