2012-01-07 2 views
0

Мой запрос: может ли метод getter возвращать тип данных обертки? Будет ли это нарушать принцип инкапсуляции? Почему нет? Является ли неизменность классов частью инкапсуляции?Методы Getter в Java

public class TestGetter{ 
private Integer a; 
public TestGetter(int _a){ 
    a = _a; 
} 
public Integer getA(){ 
    return a; 
     } 
} 

В некоторых код клиента:

TestGetter tg = new TestGetter(5); 
Integer corruptX = tg.getA();//This should return the reference 
corruptX = null; 

Так что теперь а = нуль?

Когда я запустил его, я не вижу в качестве значения null.

+1

Этот код не компилируется. Конструктор 'TestGetter (int)' требует аргумента. – erickson

+0

Возможный дубликат [Is Java pass by reference?] (Http: // stackoverflow.com/questions/40480/is-java-pass-by-reference) – erickson

ответ

3

Это не отличается от:

Object a = new Object(); 
Object b = a; 
b = null; 
// a is not null here 

Изменение ссылки не то же самое, как изменение объекта идет речь.

Чтобы ответить на ваш вопрос об инкапсуляции; да, нормально возвращать ссылку на переменную-член Integer, потому что Integer экземпляров непреложный.

+0

Да, это то, к чему я даже обращался. Что, если у нас были изменяемые экземпляры .. ??? – hakish

+0

@hakish: Если переменные-члены изменялись, тогда пользователь имеет возможность изменять внутреннее состояние вашего объекта через геттер, что плохо. –

2

Ваш тест говорит вам, почему нет никаких проблем, чтобы вернуть ссылку на объект - Java не передает значения по ссылке, поэтому, даже если вы переадресовываете corruptX, это абсолютно не влияет на данные в tg.

Это не означает, что нет проблем с передачей внутренних элементов объекта внешним абонентам. Если объекты, которые вы передаете обратно, не являются неизменными, то вы не можете защитить инварианты своего класса, так как кто-то может изменить внутренности объекта, который вы возвращаете.

Например,

//immutable point 
public class NdPoint { 

    List<Double> coordinates = new ArrayList<Double>(3); 

    public List<Double> asCoordinateList() { 
     return coordinates; 
    } 
} 

//... 
NdPoint myPoint = new NdPoint(x, y, z); 
myPoint.coordinateList().set(0, xPrime); 

Этот класс утверждает, что неизменная, но так как он не защищаясь копировать элементы, которые он проходит снаружи, он на самом деле не является неизменным. Это может сохранить неизменность, как это:

public List<Double> asCoordinateList() { 
    return new ArrayList<Double>(coordinates); 
} 
0

Это происходит потому, что значения объекта Java просто передать ссылку на объект, а не сам объект

3

Как уже упоминалось @Oli Чарльзуорт, он не отличается:

1. Object a = new Object(); 
2. Object b = a; 
3. b = null; 

и здесь графическое представление, чтобы понять, как эталонные работает в Java:

После линии 1:

enter image description here

После того, как строка 2:

enter image description here

После того, как линии 3:

enter image description here