Как использовать имена для доступа к переменным в Java? - PullRequest
1 голос
/ 17 июня 2011

Я пытаюсь написать метод в классе, который можно вызывать несколько раз, каждый раз изменяя одно из полей класса. Тем не менее, мне нужно 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 ]

1 голос
/ 18 июня 2011

Используйте держатель значения.

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() ;
1 голос
/ 17 июня 2011

Что я понимаю, так это то, что вы пытаетесь создать новый неизменяемый с целым числом (v).В вашем методе модификации k - это временная ссылка.Установка значения «k =» здесь влияет только на ссылку, хранящуюся здесь в этом методе, а не на любую ссылку, которую вы вызвали, изменить с помощью.

В настоящее время у вас есть такой код клиента:

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

и вы надеетесь, что k будет изменено.Вместо 3-й строки вы действительно хотите:

k = new Immutable(y);

Если предположить, что все действительно сложнее, тогда мне потребуется дополнительная информация, чтобы помочь вам в дальнейшем.

1 голос
/ 17 июня 2011

Java не поддерживает Call-by-name или call-by-reference, только Call-by-value.Ваша 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);
}

Если это сложнее, чем один вызов конструктора, выделите общую часть вобщий метод.

1 голос
/ 17 июня 2011

Если вам нужен доступ к переменной с помощью строкового ключа, вы должны использовать Map .

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

public void modify(String key, int v) {
  _vars.put(key, new Immutable(v);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...