如何修改传递给Java方法的枚举

时间:2011-02-17 15:06:51

标签: java enums pass-by-value

public class Test {
    private Result result;

    public Test(Result res){
        this.result = res;
    }

    public void alter(){
        this.result = Result.FAIL;
    }
}

public enum Result{ PASS, FAIL, MORE};
public Result myResult = Result.PASS;

Test test = new Test(myResult);
test.alter();

在上面的示例中,如何修改myResult方法中的变量alter?由于Java是按值传递的,因此该示例只是将其值赋给this.result

5 个答案:

答案 0 :(得分:3)

您无法修改实际的枚举值。它们本质上是名为常量的类。 如果你想在enum实例中改变行为,那么你不需要枚举(如果你可以改变对象,那么对象的其他使用者不能将它视为常量)。

答案 1 :(得分:2)

基本上,你不能,因为Java是按值传递的。

在Java中,您可以获得最接近引用行为的行为是创建一个带有getter和setter的“holder”类; e.g。

public class ResultHolder {
    private Result value;
    public ResultHolder(Result initial) { value = initial; }
    public void setValue(Result newValue) { value = newValue; }
    public Result getValue() { return value; }
}

然后,您可以将alter()写为:

public void alter(ResultHolder holder, Result newValue) {
    holder.setValue(newValue);
}

请注意,这是真实的传递引用。

答案 2 :(得分:0)

简单地说,你不能用Java做到这一点。

答案 3 :(得分:0)

由于myResult是类字段,您可以通过分配其他值来更改它: myResult = Result.MORE;。你在哪里编写这段代码并不重要。

答案 4 :(得分:0)

public class Test {
    private Result result;

    public Test(Result res){
        this.result = res;
    }

    public Result alter(){          // signature changed
        this.result = Result.FAIL;
        return this.result;         // new
    }
}

_

public enum Result{ PASS, FAIL, MORE};
public Result myResult = Result.PASS;

Test test = new Test(myResult);
myResult = test.alter();            // change the value