<java复习>返回可变对象引用的get方法要点
在看java核心技术第一卷的第四章时,学习到了一个关于访问器方法可能会破坏类的封装性的情况,在以前一直没有发现这个问题。
这个情况表现如下:对于一个返回可变对象的访问器方法,外部代码可以通过调用这个可变对象的方法来修改其中的值,从而改变对象的状态,破坏了类的封装性
例如:有一个类Emploee,其中有一个Date的字段,当使用get方法获取到Date对象时,在类外可以使用Date的set方法修改这个对象的值,从而违背了面向对象封装性的要求。
1 import java.util.Date; 2 3 public class Study2 { 4 public static void main(String[] args) { 5 Employee employee = new Employee(); 6 Date a = new Date(); 7 employee.setDay(a); 8 //Sat Aug 22 22:59:45 CST 2020 9 System.out.println(employee.getDay().toString()); 10 Date d = employee.getDay(); 11 double t = 24*10*365.25*60*60*1000; 12 d.setTime(d.getTime() - (long)t); 13 //a = Mon Aug 23 10:59:45 CST 2010 14 System.out.println("修改后 a = " + a.toString()); 15 //d = Mon Aug 23 10:59:45 CST 2010 16 System.out.println("d = " + d.toString()); 17 } 18 } 19 class Employee{ 20 private Date day; 21 22 public Date getDay(){ 23 return this.day; 24 } 25 public void setDay(Date day){ 26 this.day = day; 27 } 28 }
书中给出的解决方法是采用克隆的方法,对于返回可变对象引用的方法,返回其克隆的对象,这样子就避免了在类外可以修改到类的可变对象字段。
不过我认为要具体情况具体分析,对于一些确实需要在类外修改可变对象值得情况要特殊考虑。