减少并增加枚举值

时间:2017-01-03 12:35:18

标签: java enums

我想创建一个名为increaseValue的方法,它的签名如下:

public Size increaseValue(Size s)

我还有以下声明:

protected enum Size {XS, S, M, L, XL}

我需要知道,如何在不使用Switch-Case语句的情况下使方法返回正确的值(即输入为L时的XL ......等)?

谢谢!

6 个答案:

答案 0 :(得分:6)

您可以假设它们正在增加ordinal()次序。我会在Size上添加一个方法。

protected enum Size {
    XS, S, M, L, XL;
    static final Size[] VALUES = values();
    public Size incrementSize() { return VALUES[ordinal()+1]; }
    public Size decrementSize() { return VALUES[ordinal()-1]; }
}

注意:我不会认为XS是在XL之后,而是你得到一个错误(虽然不是很清楚)

注意:每次调用values()时,都会创建一个新数组。它必须这样做,因为数组是可变的,你可能会改变它。我强烈建议您保存副本,避免每次都致电values()

您可以通过覆盖这些方法来使错误消息更加清晰。

protected enum Size {
    XS {
        public Size decrementSize() { throw new UnsupportedOperationException("No smaller size"); }
    }, 
    S, 
    M, 
    L, 
    XL {
        public Size incrementSize() { throw new UnsupportedOperationException("No larger size"); }
    };
    static final Size[] VALUES = values();
    public Size incrementSize() { return VALUES[ordinal()+1]; }
    public Size decrementSize() { return VALUES[ordinal()-1]; }
}

答案 1 :(得分:1)

在良好的OO设计中,您希望内化这样的事情。含义:您希望提供类似" nextSize()"的方法。在那个枚举中,如:

public enum Size {
  XS, ...;

 public Size nextSize() {
   switch (this) ...

在这种情况下,这些值可能已经修复了&#34 ;;但在其他情况下,您可能以后想要插入新常量;因此我更喜欢这里的显式映射;而不是依赖于对ordinal()的调用。

正如其他答案所述:您需要定义largestSize().nextSize()的含义。它可能抛出异常,或返回null(baaad idea)。或者,该方法可以返回Optional<Size>;告诉来电者此方法并不总是返回有效结果。

答案 2 :(得分:1)

这就是你不应该这样做的原因:如果你对你的枚举进行算术运算,你最终会得到无效的值,例如你在XL中添加一个会发生什么?

以下是您的工作方式:

Size.values()[s.ordinal()+1]

答案 3 :(得分:0)

public Size increaseValue(Size s) {
   Size[] allValues = Size.values();
   var newOrdinal = s.ordinal() + 1;
   return (newOrdinal >= allValues.length) ? null) : allValues[newOrdinal];
}

public Size decreaseValue(Size s) {
   var newOrdinal = s.ordinal() - 1;
   return  (newOrdinal < 0) ? null : values()[newOrdinal];
}

答案 4 :(得分:0)

试试这个:

public Size increaseValue(Size s) {
    return Size.values()[s.ordinal() + 1]
}

答案 5 :(得分:0)

你可以像这样修改这个枚举:

  protected enum Size {
   XS,(1) 
   S(2), 
   M(3), 
    L(4), 
    XL(5);

private int sizeNo;

 Size(int sizeNo) {this.sizeNo = sizeNo;} 


 Size getBySizeNo(int sizeNo){
     for(size : Size.values()) {
     if (sizeNo == size.getSizeNo() ) {
     return size;
} 
} 
   throw new IllegalArgumentException() ;
} 

public Size increaseValue(Size s){
       return getBySizeNo(s.getSizeNo() +1) ;
      } 
 }