Java:如何限制可以传递给方法的参数值

时间:2015-02-22 13:34:22

标签: java

假设我有一个方法,将一个int作为参数,

假设该方法只需要值 0,1,2 而不是其他int

有没有办法“强制”该方法只接受0,1,2?

3 个答案:

答案 0 :(得分:7)

您必须创建一个只能采用值012的自定义数据类型。您无法使用普通的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);
}