如何使用名称来访问Java中的变量?

时间:2011-06-17 17:50:14

标签: java variables methods parameters immutability

我正在尝试在类中编写一个方法,可以多次调用,每次修改一个类的字段。但是,如果我想修改它,我需要new对象并将字段的值设置为它,但如果在方法中执行此操作,则引用似乎丢失并且字段在调用后保持不变。

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),然后使用字段名称来访问它?

感谢您的任何意见!

4 个答案:

答案 0 :(得分:1)

如果需要通过String键访问变量,则应使用Map

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

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

答案 1 :(得分:1)

我的理解是你试图在给定整数(v)的情况下创建一个新的Immutable。在你的修改方法中,k是一个临时引用。在此处设置值“k =”仅影响此方法中存储的引用,而不影响您调用的任何引用。

您目前拥有此类客户端代码:

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

你希望k会被改变。你真正想要的不是第3行:

k = new Immutable(y);

假设事情真的更复杂,那么我需要更多信息来帮助你。

答案 2 :(得分: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);
}

如果它比单个构造函数调用更复杂,则将公共部分考虑为常用方法。

答案 3 :(得分: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() ;