Java:如何限制参数';s可以传递给方法的值
假设我有一个方法,它将一个Java:如何限制参数';s可以传递给方法的值,java,Java,假设我有一个方法,它将一个int作为参数 假设该方法只需要值0、1、2和而不需要其他int 有没有办法“强制”该方法只接受0、1、2?您必须创建一个自定义数据类型,该类型只能接受值0、1和2。不能使用普通的int 在这种情况下,您可以使用枚举: enum ZeroOneOrTwo { ZERO(0), ONE(1), TWO(2); public final int val; private ZeroOneOrTwo(int val) {
int
作为参数
假设该方法只需要值0、1、2和而不需要其他int
有没有办法“强制”该方法只接受0、1、2?您必须创建一个自定义数据类型,该类型只能接受值
0
、1
和2
。不能使用普通的int
在这种情况下,您可以使用枚举
:
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
。但是,一般来说,你希望让编译器解决这个问题,而不是在运行时必须处理它。在每种情况下可能都不适用(但是你没有进一步指定你想要完成的事情,所以也许值得一试),但是也许你可以考虑创建三个方法而不是一个方法。或者使用继承,因为您使用的是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) {
// ...
}
正如@JonSkeet所评论的,您可以抛出一个
IllegalArgumentException
的实例。不过,我找不到翻译的方法,也找不到强制的方法
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验证
可能适合您
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);
}
当然,如果参数无效,您始终可以抛出一个IllegalArgumentException
。您可以使用AOP(面向方面编程),如AspectJ库:创建一些注释,指示其中一个参数应受到限制,并创建与该注释匹配的连接点,并创建检查值的建议。但是,这将只执行运行时检查。如果需要静态、编译时、检查,则需要创建自己的数据类型。但是,如果更改枚举的顺序,序号将中断。如果方法应接受0、1或2,则很可能它们实际上表示的不是数量,在这种情况下为零,如果顺序不相关,1和2将有更多描述性名称。@aioobe请aioobe我不确定如何使用该枚举来表示3ints@aioobe萨蒂尔不明白:-((,在您删除costructor之前,可能更清楚。使用构造函数和枚举中的字段将costructor转换为该方法。该方法很明显:通过构造只有三个不同值的类型,使该限制对类型系统可见。这正是基于枚举的方法所实现的。