我的查询是,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?
当我运行它时,我看不到为空。
答案 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行之后:
第2行之后:
第3行之后:
答案 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值只是传递对象的引用而不是对象本身