2011-06-17 24 views
1

我想在可以多次調用的類中編寫一個方法,每次修改一個類的字段。但是,我需要new該對象,並設置字段的值,如果我想要修改它,但如果在方法內執行此操作,引用似乎丟失,並且該字段在調用後保持不變。如何使用名稱訪問Java中的變量?

Public class A { 
    private Immutable a; //Immutable class 
    private Immutable b; 
    public void modify(Immutable k,int v) { 
     k=new Immutable(v); //Now I am trying to pass 
          //a and b as parameters but they remain unchanged 
    } 
} 

有什麼辦法打發字段的名稱進入方法(例如,方法改變modify(Immutable k, int v)modify(String kName, int v),然後使用字段的名稱來訪問它?

感謝您的任何輸入!

回答

1

Java不支持按名稱或以引用方式調用,僅限於按值調用。你的k變量(方法參數)完全獨立於任何在類之外使用的變量(如果有的話)。

您可以使用Reflection來支持傳遞「a」或「b」(或Field對象),但不應該。

更好的有兩種方法:

public void setA(int v) { 
    this.a = new Immutable(v); 
} 

public void setB(int v) { 
    this.b = new Immutable(v); 
} 

如果它不是單一的構造函數調用更爲複雜,因素的共同部分分離出來的一種常用方法。

+0

ŭlo謝謝!兩個問題:首先,爲什麼不應該使用反射?其次,如果我有一堆不同的領域,是否沒有方便的方式來訪問它們? –

+0

這是一個風格問題。你班級的客戶不應該知道你的領域,這是你班級的私人地形。因此,說「請把你的領域x設爲y」並不是正確的做法。 –

+0

如果您確實有很多這樣的屬性,請使用unholysampler建議的地圖。 –

1

如果你需要一個字符串鍵來訪問一個變量,你應該使用Map

Map<String, Immutable> _vars = new HashMap<String, Immutable>(); 

public void modify(String key, int v) { 
    _vars.put(key, new Immutable(v); 
} 
1

我明白那是什麼你正在嘗試創建一個新的Immutable給定一個整數(v)。在你的修改方法中,k是一個臨時引用。在這裏設置值「k =」,隻影響此方法中存儲的引用,而不會影響您所調用的引用。

你有客戶這樣的代碼目前:

A a = new A(); 
Immutable k = new Immutable(x); 
a.modify(k, y); 

和你希望的是k將被改變。你真的想要的3號線替代的是:

k = new Immutable(y); 

假設事情真的比較複雜,那麼我會需要更多的信息來幫助您進一步。

1

使用值持有人。

public class ValueHolder<T> { 
    private T value ; 
    public ValueHolder(T value) { 
     this.value = value ; 
    } 
    public T get() { 
     return value ; 
    } 
    public void set(T value) { 
     this.value = value; 
    } 
    public static <V> ValueHolder<V> make(V value) { 
     return new ValueHolder<V>(value); 
    } 
} 
public class Processor { 
    private Inmutable a ; 
    private Inmutable b ; 
    public void modify(ValueHolder<Inmutable> k, int v) { 
     k.set(new Inmutable(v)); 
    } 
} 

一旦完成,您可以從值持有者獲得您剛剛創建的實例。

Processor processor = new Processor(); 
ValueHolder<Inmutable> holder = ValueHolder.make(k); 
processor.modify(holder, value); 
k = holder.get() ; 
相關問題