代码之家  ›  专栏  ›  技术社区  ›  H.v.M.

为最后一个枚举值指定不同的变量值

  •  0
  • H.v.M.  · 技术社区  · 2 年前

    我希望最后一个枚举在其中一个变量中具有不同的值:

    private enum thing {
        thing0(0),
        thing1(1),
        thing2(2);
    
        int index;
        String s;
    
        private thing(int index) {
            this.index = index;
            s = index == values().length - 1 ? "b" : "a";
        }
    }
    

    这行不通;你不能打电话 values() 在构造函数中。还有别的办法吗?

    1 回复  |  直到 2 年前
        1
  •  3
  •   Andy Turner    2 年前

    通常,不要依赖枚举值的声明顺序。中的项目35 通用程序设计 s ,其值取决于序号。)

    如果希望特定值具有特定属性,请将其作为构造函数参数传入。

    private enum thing {
        thing0(0),
        thing1(1),
        thing2(2, "b");
    
        int index;
        String s;
    
        private thing(int index) {
            this(index, "a");
        }
    
        private thing(int index, String s) {
            this.index = index;
            this.s = s;
        }
    }
    

    // Invokes `values()` twice, but meh, it's only executed once.
    private static final thing LAST = values()[values().length-1];
    

    然后签入getter:

    String s() {
      return this == LAST ? "b" : "a";
    }
    
        2
  •  0
  •   Holger    2 年前

    无需维护始终与 ordinal enum 常数此外,您不能依赖 values() 数组,因为它应该包含已构造的实例。但要确定存在多少常量,只需计算相关字段即可。

    public enum Thing {
        thing0,
        thing1,
        thing2;
      
        final String s;
      
        Thing() {
            this.s = ordinal() == numConstants() - 1? "b": "a";
        }
      
        @Override
        public String toString() {
            return name() + "(index = " + ordinal() + ", s = " + s + ")";
        }
      
        private static int NUM_CONSTANTS;
      
        private static int numConstants() {
            int i = NUM_CONSTANTS;
            if(i != 0) return i;
            for(Field f: Thing.class.getDeclaredFields()) if(f.isEnumConstant()) i++;
            NUM_CONSTANTS = i;
            return i;
        }
    }
    

    所以 System.out.println(EnumSet.allOf(Thing.class)); 印刷品

    [thing0(index = 0, s = a), thing1(index = 1, s = a), thing2(index = 2, s = b)]
    

    请注意 numConstants() 缓存中的值 NUM_CONSTANTS 这是安全的 private 方法仅在类初始值设定项中调用。我们不能使用 static final 变量,因为所有自定义类初始化都将完成 之后 这个 枚举 已构造常量。