2011-02-17 66 views
1
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(); 

在上面的例子中,我將如何修改變量myResultalter方法裏面?由於Java是按值傳遞的,因此該示例將其值分配給this.result如何修改枚舉傳遞到Java方法

+0

正是在這裏:http://stackoverflow.com/questions/3997518/passing-enums-by-ref-in-java – smas 2011-02-17 15:13:10

回答

2

基本上,你不能,因爲Java是傳遞值。

在Java中最接近通過引用行爲的方式是使用getter和setter創建一個「holder」類;例如

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

謝謝,我考慮把它的對象內,但不知道是否有一些其他方法來欺騙它。 – Gorgon 2011-02-17 15:25:11

0

簡而言之,你不能用Java來完成它。

0

由於myResult是類字段,您可以在希望時通過指定其他值來更改它: myResult = Result.MORE;。無論您在哪裏編寫此代碼都無關緊要。

2

您不能修改實際的枚舉值。他們基本上是名爲常量的類。 如果你想在枚舉實例內改變行爲,那麼你不想要枚舉(如果你可以改變對象,那麼對象的其他消費者不能把它當作一個常量)。

+0

+1這是真正的答案。如果你試圖改變一個枚舉參數,那麼你不希望一個枚舉開始。 – 2012-01-17 01:33:46

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