我想创建一个名为增量值的方法,它的签名如下:
public Size increaseValue(Size s)
我也有以下声明:
protected enum Size {XS, S, M, L, XL}
我需要知道,在不使用Switch-Case语句的情况下,如何使方法返回正确的值(即输入为L时的XL…等)?
谢谢!
您可以假设它们是按序号()
顺序递增的。我会在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想法)。或者,该方法可以返回可选