我想创建一个名为increaseValue的方法,它的签名如下:
public Size increaseValue(Size s)
我还有以下声明:
protected enum Size {XS, S, M, L, XL}
我需要知道,如何在不使用Switch-Case语句的情况下使方法返回正确的值(即输入为L时的XL ......等)?
谢谢!
答案 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) ;
}
}