2015-03-12 5 views
0

Название немного разочаровывает, но я не могу понять, как правильно сформулировать вопрос. Итак, я покажу свою проблему с кодом. Например, мы имеем:Java работает со ссылками

public class Test { 

    public Value val; 

    Test(Value val){ 
     this.val = val; 
    } 

    public static void main(String[] a){ 
     Value val = new Value(1); 

     Test test1 = new Test(val); 
     val = new Value(2); 

     System.out.println(test1.val.val); 
    } 
} 

Как я могу изменить свой код легко позволить test1 точку к новому валу (то что имеет значение 2). Предположим, что нам нужно иметь такие ссылки (по фактической переменной, а не по памяти) по всей программе.

UPD: Одно из решений, которое я нашел, - это сделать «обновление». Поэтому я мог бы написать val.update (новый Val (2))

UPD: Я полностью согласен с методами setter. Я хочу не стиль ООП, но в моем проекте мне нужно быстрое решение, даже если оно не будет лучшим. Я думаю, что я нашел одно решение (на самом деле это плохо, но быстрее, чем писать сеттеры и геттеры). Решение состоит в создании класса «обертка» (я мог бы назвать его «Reference»)

+1

искать методы получения и установки. Напишите метод сеттера 'setVal (Value val)' и вызовите его с новым значением. –

+0

Да, метод сеттера - это способ пойти – chancea

+0

@Julien: Нет, это не подходящий дубликат. – Makoto

ответ

1

Поскольку мы должны давать ответы, я просто повторю то, что мы получили в комментариях уже.

Чтобы изменить значение переменной экземпляра Value val за пределами класса, вам необходимо написать методы настройки. Если вы хотите получить значение, вам понадобятся методы getter.

Плохая практика: вам не следует объявлять переменную экземпляра public и написать ее непосредственно. Это противоречит принципам ООП, таким как инкапсуляция, иначе вы не хотите знать, что делается в классе, вы просто хотите знать ее внешнее поведение. Поэтому объявите его private.

Также проверьте Use public getters/setters to access private variables in the same class, or access the variables directly и http://www.cs.colostate.edu/~cs161/Fall12/labs/lab2/bookgetset.html

3

Обычно вы хотите определить сеттер изменить любое из значений поля в классе.

public void setVal(Value val) { 
    this.val = val; 
} 

Но, так как ваш val поле public, вы не должны использовать сеттер на всех.

// after you've declared `val` to be a new value 
test1.val = val; 

сеттеры conv при работе с JavaBeans или с фреймами, которые имеют ожидание того, что поле имеет соответствующий геттер и/или сеттер.

Смежные вопросы