2014-09-23 23 views
1

考慮下面的代碼:解引用可能嗎?

public class Test { 

    static private volatile Integer number1 = 42; 
    static private volatile Integer number2 = 42; 

    public static void main(String[] args) { 
     Test test = new Test(); 
     test.changeInteger(number1); 
     System.out.println(number1); 
    } 

    public void changeInteger (Integer number) { 
     number = new Integer(3); 
    } 
} 

我想改變取決於我傳遞給該方法changeInteger參數中的任一或number1number2值。顯然這是行不通的。有沒有一種方法可以在不使用反射的情況下使用Java進行工作?

澄清:我想致電changeInteger(number1)更改字段number1

+3

你有幾個選擇,使用數組,使用if/else語句,使用switch語句..但是,更重要的是,爲什麼? – 2014-09-23 12:42:16

+4

可能重複[是Java「傳遞引用」還是「傳遞值」?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass (按值) – Smutje 2014-09-23 12:43:41

+0

@ChrisK我的實際代碼有點複雜。這些字段是實際的WeakRerences,將通過雙重檢查的鎖定模式由多個線程訪問。所以我想要一個簡單的方法來參數化哪個字段將被更新。 – Roland 2014-09-23 12:46:43

回答

2

只需添加到@ Margus的答案。 在我的書中,如果變量名稱有史以來包含一個數字,如number1,這是一個跡象表明你做得不對。使用數組。另一方面,如果你的變量實際上是,那麼命名爲,那麼你最好使用Hashtable。 類中的字段名稱是硬編碼的。如果你需要非硬編碼的「字段名稱」,那麼它們不是真正的字段。他們是數據!所以hashtable/dictionary是Java中的正確路由。

2

您需要從方法返回變量的值。否則,變量值的變化受限於'changeInteger'方法的方法調用堆棧。

public static void main(String[] args) { 
     Test test = new Test(); 
     number1 = test.changeInteger(number1); 
     System.out.println(number1); 
    } 

    public Integer changeInteger (Integer number) { 
     return new Integer(3); 
    } 
4
public class Test { 
    public Integer[] number = {42, 42}; 
    public static void main(String[] args) { 
     Test test = new Test();    //you create a new instance 
     test.number[0] = new Integer(3); //change first element to 3 
     test.number[1] = new Integer(2); //change second element to 2 
     System.out.println(test.number[0]); //print first element 
    } 
} 

關於數組:manual 演示:http://ideone.com/aKzQI0