Java 中是否有嵌套枚举之类的东西?

Is there something like nested enums in 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;

不能

那样将嵌套枚举分配给它的父级
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_STATESARGENTINA赋值给SomeEnum

类型

@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);

你会得到你想要的!

我建议您寻找一种不同的方法来实现这一点。如果您能想出一种 'nesting' 国家/地区中的州的方法,那么您将遇到没有针对所有州的单一类型的问题。您将无法拥有可以分配美国州或阿根廷州的 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;

你可以使用像

这样的界面
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;