假设我有一个方法,将一个int
作为参数,
假设该方法只需要值 0,1,2 和而不是其他int 。
有没有办法“强制”该方法只接受0,1,2?
答案 0 :(得分:7)
您必须创建一个只能采用值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
范围。但通常你会想让编译器捕获问题,而不是在运行时处理它。
答案 1 :(得分:2)
可能并不适用于所有情况(但你没有进一步指明你想要完成的事情,所以也许它值得一试),但也许你可以考虑创建三种方法一个?或者使用继承,因为您使用的是OOP语言?
例如,代替将一些信息编码到int
中,改变它可能是更好的编码风格。
所以不是......
void 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) {
// ...
}
答案 2 :(得分:1)
正如@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可能是一个很好的方法,我想这样。
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);
}