我正在尝试在类中编写一个方法,可以多次调用,每次修改一个类的字段。但是,如果我想修改它,我需要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)
,然后使用字段名称来访问它?
感谢您的任何意见!
答案 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() ;