提问者:小点点

减少和增加枚举值[重复]


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

public Size increaseValue(Size s)

我也有以下声明:

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

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

谢谢!


共3个答案

匿名用户

您可以假设它们是按序号()顺序递增的。我会在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之后,而是会收到一个错误(尽管不是很清楚)

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

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

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]; }
}

匿名用户

以下是您不应该这样做的原因:如果您对枚举执行算术运算,您最终可能会得到无效值,例如,如果您将一个添加到XL会发生什么?

你是这样做的:

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

匿名用户

在良好的OO设计中,您希望将这些内容内化。含义:您希望在该枚举中提供类似“nextSize()”的方法,例如:

public enum Size {
  XS, ...;

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

在这种情况下,值可能是“固定的”;但在其他情况下,您以后可能想要插入新的常量;因此我更喜欢这里的显式映射;而不是依赖于对序号()的调用。

正如其他答案中提到的:您需要定义大尺寸(). nextSize()的含义。它可以抛出异常,或返回null(baaad想法)。或者,该方法可以返回可选