表示泄露总结

一、定义
在java编程中,我们实现某个类时,每个类都定义一些域。有immutable的例如String,有mutable的例如list,set。而我们在构造观察器的时候如果不对mutable类型的变量进行表示处理,就容易在外部对内部的类属性进行修改,而我们正常则应该需要调用内部方法才能对内部属性进行修改。
二、

以上图定义为例,我们在外部就可以name,age和nickname进行修改。

我们可以发现,控制台的输出使类的内部属性都被修改了。这就导致我们编写的类是不安全的,内部的属性,应该用内部的方法来修改,而不应该外部引用就可以修改。编写immutable类会使程序健壮性更强。

三、解决方法

首先我们要对类的域由public改为private,这样你会发现我们无法直接通过ming.name和ming.age来直接获得内部属性

接着,我们想,我们在写程序的时候必然需要有观察器,即要获得内部属性的值。所以我们需要写一系列获得内部属性的方法。

然而我们观察getNickname()方法,返回的是nickname的地址,这其实又会导致表示泄露,如下。

在这里插入图片描述

发现我们还是通过外部修改改变了类的属性,这显然是不合法的。所以接下来想到,如果我们返回一个Nickname的副本,是否可以避免这种情况。

在这里插入图片描述

发现实现了immutable类型。
究其原因,我们发现要实现一个immutable类。首先你的field得是private型的,不然外部可以直接修改。然后你的一些观察器方法,如果是对mutable型的例如set,list直接返回地址,应该返回一个副本。防止被接受后进行恶意修改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值