<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 }

       书中给出的解决方法是采用克隆的方法,对于返回可变对象引用的方法,返回其克隆的对象,这样子就避免了在类外可以修改到类的可变对象字段。

不过我认为要具体情况具体分析,对于一些确实需要在类外修改可变对象值得情况要特殊考虑。

posted @ 2020-08-22 23:05  龙刃已准备出鞘  阅读(301)  评论(0编辑  收藏  举报