【问题标题】:Is there something like nested enums in Java?Java中有类似嵌套枚举的东西吗?
【发布时间】:2017-02-13 10:26:55
【问题描述】:

我想做一个 Country 枚举,我可以从中访问其状态,我该怎么做?

类似这样的:

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;

【问题讨论】:

  • 你到底想达到什么目的_??

标签: java types enums enumset enum-map


【解决方案1】:

你可以使用类似的界面

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;

【讨论】:

    【解决方案2】:

    不能将嵌套枚举分配给其父级,例如

    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 的类型

    【讨论】:

    • 根据需求,可进行详细设计。例如,如果您希望能够将任何国家的状态分配给变量myState,您可以声明一个标记interface State {} 并让内部枚举实现它(enum ARGENTINA implements State …),所以State myState = SomeEnum.ARGENTINA.BUENOS_AIRES; 将起作用.
    • 他们都可以实现相同的interface Country
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      你会得到你想要的!

      【讨论】:

      • “你到底想要什么”——除了类型安全 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2015-11-03
      • 2011-12-29
      相关资源
      最近更新 更多