package Learning; import java.util.Date; public class ClassDemo { private String sss; private Date d; public ClassDemo(String sss) { this.sss = sss; } public String getSss() { return sss; } public ClassDemo(String sss, Date d) { this.sss = sss; this.d = d; } public Date getD() { return d; } public static void main(String[] args) { ClassDemo c=new ClassDemo("asd",new Date()); System.out.println(c.d); Date s=c.getD(); s.setTime(1212123123); System.out.println(c.d); } }
根据上图可以发现对象中的数据被修改了,但是代码中并没有修改器方法,只有访问器方法,那么问题出在了哪里?
由于getD返回的方法是一个引用可变对象,这导致了类外部的一个Date类也拥有了管理类内部数据的渠道,也就是这个外部的Date类指向了类内部的成员,而这时对内外部的数据进行修改也会同时修改类内部的数据,因此请不要编写返回引用可变对象的访问器方法。
当然,如果一定要返回一个可变对象的引用,那么应该先对它进行克隆,对象clone是指存放在另一个位置上的对象副本。
修改后的getD代码如下:
public Date getD() { return (Date)d.clone(); }
可以发现修改外部Date对象并没有导致类内对象的数据被修改。