zoukankan      html  css  js  c++  java
  • <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 }

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

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

  • 相关阅读:
    Android HandlerThread
    JavaScript数据类型
    Android:VideoView
    我是如何跟踪log4j漏洞原理及发现绕WAF的tips
    Dubbo的反序列化安全问题——kryo和fst
    使用移动硬盘快速安装win7(附BIOS设置)
    OpenStack Swift All In One安装部署流程与简单使用
    C语言浮点数运算
    使用注册表文件(REG)添加、修改或删除Windows注册表项和值
    Linux之TCPIP内核参数优化
  • 原文地址:https://www.cnblogs.com/mlcn-2000/p/13547665.html
Copyright © 2011-2022 走看看