前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于防止改变对象内部不可变状态的小例子

关于防止改变对象内部不可变状态的小例子

作者头像
java达人
发布2018-01-31 17:56:50
8150
发布2018-01-31 17:56:50
举报
文章被收录于专栏:java达人java达人

Java相对于c而言,是一门比较安全的语言,免去了指针操作带来的各种不安全因素,但是当你构建一个类,给别人提供接口,在交互的过程也会带来不少麻烦,有时候甚至会改变对象内部的不可变状态,请看下面例子。

代码语言:js
复制
 public class Tryst {
 private final Date  date;
 public Tryst(Date date){
 this.date = date;
       }
 public Date getDate() {
 return date;
       }
 }

Tryst是幽会的意思,有女友的程序员朋友都知道,初次约会的时候,女生最喜欢男友准时准点地在那里等,而不是干巴巴地让女孩子在等,等久了,是要删游戏装备的,哈哈。所以约会的时间不能随意改变,在这里用了final关键字修饰(注意,final修饰变量,如果是基本类型,则值当然不可变,若是对象,指的是它不能指向其他对象,而引用的对象本身是可变的)。

那这是否意味着date不可变了呢,答案是否定的,请看:

代码语言:js
复制
   Calendar cal = Calendar.getInstance();
   cal.set(2016, 3, 22);
        Date date = cal.getTime();
        Tryst tryst = new Tryst(date);
 date.setDate(23);

看见没有,方法调用者可能是捣蛋鬼或者经验不足,如果他这样去调用,日期从22号变成23号,这不就错过了吗?那有什么方法可以防止这种情况发生呢。仔细思考一分钟......

代码语言:js
复制
  public Tryst(Date date){
 this.date =new  Date(date.getTime());
      }

我们重新定义构造方法,这样Tryst就不会受到上述调用的影响。那这段代码是否就没有任何瑕疵了呢,别忘了我们还开了一扇门放小偷进来,继续思考......

代码语言:js
复制
 Calendar cal = Calendar.getInstance();
 cal.set(2016, 3, 22);
        Date date = cal.getTime();
        Tryst tryst = new Tryst(date);
 tryst.getDate().setDate(23);
  对了,这扇门就是getDate()方法,于是我们很快可以想到如何关上这扇门:
 public Date getDate() {
 return new  Date(date.getTime());
    }

看到了吧,就是这么一段简单的代码,还是有不少出差错的可能的,软件是一件需要不断精细打磨的艺术品,所有的程序员都是工匠,是艺术家。开发一件不断被使用的产品,说某个功能很简单,可以原谅,但说功能开发好之后,万事大吉,不需要继续投入的boss和pm,都是傻逼。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档