Java中的Getter方法

时间:2012-01-07 02:01:40

标签: java

我的查询是,getter方法是否可以返回包装器数据类型?它会违反封装原则吗?为什么不?类的不变性是封装的一部分吗?

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;

所以现在 a = null?

当我运行它时,我看不到为空。

4 个答案:

答案 0 :(得分:3)

这与:

没什么不同
Object a = new Object();
Object b = a;
b = null;
// a is not null here

修改引用与修改引用的对象不同。

回答有关封装的问题;是的,可以返回对Integer成员变量的引用,因为Integer个实例不可变

答案 1 :(得分:3)

正如@Oli Charlesworth所提到的,它与:

并无不同
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

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

答案 3 :(得分:0)

这是因为Java Object值只是传递对象的引用而不是对象本身