3
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.

4

5 回答 5

4

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

在 Java 中最接近按引用传递的行为是创建一个带有 getter 和 setter 的“持有者”类;例如

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);
}

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

于 2011-02-17T15:11:13.063 回答
3

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

于 2011-02-17T15:13:48.490 回答
0

简而言之,你不能在 Java 中做到这一点。

于 2011-02-17T15:10:34.673 回答
0

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

于 2011-02-17T15:12:50.163 回答
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
于 2011-02-17T15:24:55.830 回答