rep exposure

        表示泄露(rep exposure),即ADT内部的某些数据可能会由于某些操作暴露给外部。  首先变值器是否是表示泄露?例如我的一个ADT开发为地点, 设置了一个改变经纬度的变值器,这是否为表示泄露? 答案:不是,变值器设置的值发生了改变,这种肯定显然不是表示泄露。   那么获得器getter是否有表示泄露? 这就是我犯下的错误。 首先 返回一个immutable的类或者基本数据类型(int double)这些显然都不会有表示泄露。 例如下图:

       

     若location为一个immutable的类,这里是没有表示泄露的。 location可以看作一个指向某个Location类的指针,对于一个immutable类,其内容显然是不变的,那么location这个指针的值(即所指对象)发生了改变吗? 答案是否,如果这个类内部没有setter(即让location)发生改变,那么location这个指针的值自创造以来就永远不会发生变化,其指向的值由于是immutable的,那么其内部内容就不会发生变化。由此,外部实际上是无法对该指针的值进行操作的,也就无法改变其内容。如果有如下代码:

    Location p=xx.getLocation();

     p.xxxxxx(这里因为是immutable的类,无法改变内部内容)

    p=xxx2.getLocation();

    很显然xx里面的location是没有被改变的。

     那么如果类是mutable的,再次应用上述代码,就会很容易发现问题,p.xxxx这一步可能是某个setter,这样外部就绕过了xx类可能提供了的变值器,修改了ADT内部变量成员的值,这样就产生了表示泄露。

     而我所做的实验里对于immutable不必多说,本身防范行就较好。而对于mutable类的防范性实际上不够,我们来看下面两段代码:

     

     

      上述两个代码分别来自我的实验2与实验3。 第一张图就产生了表示泄露的问题,请看如下代码(假设图1的类为xxx)

      Set<L> temp=xxx.vertices();

      temp.add(p);

      如果外部通过这样的方式调用了set的话,那么就会出现较大的错误,此时xxx类的vertices和外部代码中的temp指向的是同一个Set,即他们的指针值是一样的,由此产生了严重的表示泄露。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值