浅谈表示泄露
一、定义
在java编程中,我们实现某个类时,每个类都定义一些域。有immutable的例如String,有mutable的例如list,set。而我们在构造观察器的时候如果不对mutable类型的变量进行表示处理,就容易在外部对内部的类属性进行修改,而我们正常则应该需要调用内部方法才能对内部属性进行修改。
二、例子
以上图定义为例,我们在外部就可以name,age和nickname进行修改。
我们可以发现,控制台的输出使类的内部属性都被修改了。这就导致我们编写的类是不安全的,内部的属性,应该用内部的方法来修改,而不应该外部引用就可以修改。编写immutable类会使程序健壮性更强。
三、解决方法
首先我们要对类的域由public改为private,这样你会发现我们无法直接通过ming.name和ming.age来直接获得内部属性
你会发现直接引用程序会报错。接着,我们想,我们在写程序的时候必然需要有观察器,即要获得内部属性的值。所以我们需要写一系列获得内部属性的方法。
然而我们观察getNickname()方法,返回的是nickname的地址,这其实又会导致表示泄露,如下。(假设接下来不能进行nickname.remove()和nickname.add()操作)
发现我们还是通过外部修改改变了类的属性,这显然是不合法的。所以接下来想到,如果我们返回一个Nickname的副本,是否可以避免这种情况。
此时再进行刚才的操作,查看运行结果。
发现实现了immutable类型。
究其原因,我们发现要实现一个immutable类。首先你的field得是private型的,不然外部可以直接修改。然后你的一些观察器方法,如果是对mutable型的例如set,list直接返回地址,应该返回一个副本。防止被接受后进行恶意修改。