Java中类的私有成员的引用是可以被类的的方法返回的,如果这样的程序设计出来的话,它就没有什么封装性可言,甚至造成的后果是难以预料的。
先来看看下面的例子:
import java.awt.Dimension;
/**
* 类的私有引用被返回破坏类的封装性
* @author Sunny
* @version 1.0
*/
public final class ReturnTest {
private Dimension d = new Dimension(0,0);
/**
*
* @return Dimension
*/
public Dimension getDimension() {
return d;
}
/**
*
* @return String
*/
public String toString() {
return d.toString();
}
/**
* @param args
*/
public static void main(String[] args) {
ReturnTest test = new ReturnTest();
System.out.println("NO change:" + test.toString());
Dimension d = test.getDimension();
d.height = -9;
d.width = 10;
System.out.println("Changed:" + test.toString());
}
}
这个程序的执行结果是:
NO change:java.awt.Dimension[width=0,height=0]
Changed:java.awt.Dimension[width=10,height=-9]
通过这个程序就很明白了,封装性被完全破坏了,造成的后果是可怕的。我们在设计程序是对于复杂数据类型的数据成员,在考虑它要被返回时必须考虑,一种通常的做法是返回该成员的拷贝(clone),针对上面的例子,只需要把getDimension方法改成下面的样子:
public Dimension getDimension() {
return (Dimension)d.clone();
}