假设我有一个方法,它需要一个整数作为参数,假设该方法只接受值为0、1、2而不接受其他整数。有没有一种方法可以“强制”该方法只接受0、1、2呢?
您需要创建一个自定义数据类型,该数据类型仅能接受值为0
、1
和2
,不能使用普通的int
。
在这种情况下,您可以使用枚举类型enum
:
enum ZeroOneOrTwo {
ZERO(0),
ONE(1),
TWO(2);
public final int val;
private ZeroOneOrTwo(int val) {
this.val = val;
}
}
并将其用于以下模式:
void myMethod(ZeroOneOrTwo arg) {
System.out.println("Int value: " + arg.val);
}
如果你被强制要求以int
作为参数(例如,如果你正在实现一个接口),则可以在给定值超出范围时抛出IllegalArgumentException
。但通常情况下,你会希望让编译器捕获这个问题,而不是在运行时处理它。
valueOf(int)
的方法,在该方法中抛出IllegalArgumentException
,并在原始方法中使用它来接收一个int
。 - Jin Kwonvoid addEmployee(int type) {
switch(type) {
case 0: // add regular eymploee
case 1: // add manager
case 2: // add CEO
}
}
考虑以下情况:
void addRegularEmployee() {
// ...
}
void addManager() {
// ...
}
void addCEO() {
// ...
}
...甚至可能会出现...
void add(Employee e) {
// ...
}
正如 @JonSkeet 评论所说,您可以抛出 IllegalArgumentException
的实例。虽然我找不到翻译 the way to force
的方法。
void giveMeZeroOneOrTwo(final int value) {
if (value != 0 && value != 1 && value != 2) {
throw new IllegalArgumentException("unacceptable value: " + value);
}
// now you can read the method name, huh?
}
Bean Validation
可能适合您。void giveMeZeroOneOrTwo(@Min(0) @Max(2) final int value) {
}
好的,使用枚举可能是一个不错的方法,我很喜欢这个。
enum Magic {
ONE(1),
TWO(2),
THREE(3);
public static Magic valueOf(int value) {
for (final Magic v : values()) {
if (v.value == value) {
return v;
}
}
throw new IllegalArgumentException("undefined value: " + value);
}
private Magic(int value) {
this.value = value
}
private final int value;
}
int
的方法。void giveMeOneTwoOrThree(final int value) {
// still throws an IllegalArgumentException
final Magic magic = Magic.valueOf(value);
}