1、如何实现体现封装性
一个私有的数据域 ;
一个公有的域访问器方法 ;
一个公有的域更改器方法 ;
public class Test(){
private String name;
private Date date;
public String getName( ){
return name;
}
public Date getDate( ){
return date;
}
public void setName(String name ){
this.name=name;
}
public void setDate(Date date ){
this.Date=date;
}
}
2、这样做的好处
这样做要比提供一个简单的公有数据域复杂些 , 但是却有着下列明显的好处 :
第一, 可以改变内部实现 , 除了该类的方法之外 , 不会影响其他代码 。 例如 , 如果将存储名字的域改为 :
String firstName ;
String lastName ;
那么 getName 方法可以改为返回
firstName + " " + lastName
对于这点改变 , 程序的其他部分完全不可见 。
第二点, 更改器方法可以执行错误检查, 然而直接对域进行赋值将不会进行这些处理。 例如 , setName 方法可以检查姓名是否为数字或者其他特殊字符。
在此特别提出注意的一点:不要编写返回引用可变对象的访问器方法 。 在 Test 类中就违反了这个设
计原则 , 其中的 getDate 方法返回了一个 Date 类对象 。
Date 对象是可变的 , 这一点就破坏了封装性 ! 请看下面这段代码 :
Test test = new Test();
Date d = test.getDate();
double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000 ;
d.setTime(d.getTime()-(long)tenYearsInMilliSeconds);
出错的原因很微妙 。 d 和 test.date 引用同一个对象,对d调用更改器方法就可以自动地改变这个对象的私有状态 !!如图:
如果需要返回一个可变对象的引用 , 应该首先对它进行克隆 ( clone ) 。 对象 clone 是指存放在另一个位置上的对象副本。如下:
public Date getDate( ){
return (Date)date.clone();
}