Как изменить перечисление, переданное в метод Java - PullRequest
1 голос
/ 17 февраля 2011
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 ]

3 голосов
/ 17 февраля 2011

Вы не можете изменять фактические значения перечисления. По сути, это классы с именованными константами. Если вы хотите изменить поведение внутри экземпляра enum, тогда вам не нужен enum (если вы можете изменить объект, то другие потребители объекта не смогут рассматривать его как константу).

2 голосов
/ 17 февраля 2011

По сути, вы не можете, потому что Java передается по значению.

Наиболее близким к поведению передачи по ссылке в Java является создание класса "holder" с использованием метода get и set; например,

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

Обратите внимание, что это , а не реальная передача по ссылке.

0 голосов
/ 17 февраля 2011
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
0 голосов
/ 17 февраля 2011

Поскольку myResult является полем класса, вы можете изменить его, если хотите, назначив другое значение: myResult = Result.MORE;. не имеет значения, где вы пишете этот код.

0 голосов
/ 17 февраля 2011

Проще говоря, вы не можете сделать это на Java.

...