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内の変数をどのように変更しますか? alterJava は値渡しなので、この例では単純にその値を に代入します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

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 に答える
0

簡単に言えば、Java ではできません。

于 2011-02-17T15:10:34.673 に答える