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转换为该方法。该方法很明显:通过构造只有三个不同值的类型,使该限制对类型系统可见。这正是基于枚举的方法所实现的。