May expose internal representation by incorporating reference to mutable object

FindBugs分析bug

May expose internal representation by incorporating reference to mutable object

This code stores a reference to an externally mutable object into the internal representation of the object.  If instances are accessed by untrusted code, and unchecked changes to the mutable object would compromise security or other important properties, you will need to do something different. Storing a copy of the object is better approach in many situations.

 

大概意思:

 

这个代码存储引用一个外部的可变对象的内在表现的对象。

如果情况下能够用不可信赖的代码,和未改变的可变对象会削弱安全或其他重要的性质,你需要做一些不同的事情。

存储拷贝一个对象,在许多情况下有更好的方法。

 

package test; 

import java.util.Date; 

public class Demo { 

 /**
  * @param args
  */
 public static void main(String[] args) {
        Test test= new Test(); 
        Date now = new Date();   
        test.setCreateDate(now);
        System.out.println(test.getCreateDate());
        now.setYear(210);//问题所在!
        System.out.println(test.getCreateDate()); 

     }
} 

  

package test; 

import java.util.Date; 

    public class Test { 

    private Date createDate ;    

    public void setCreateDate(Date createDate) { 

//      Findbugs提示下一行
        this.createDate = createDate; 
//      this.createDate = createDate==null?null:(Date)createDate.clone(); 
//      先判断一下是否为null,如果为判断之前就为null,强转(Date)一定会报异常
    } 

    public Date getCreateDate() { 
        return createDate; 
    } 

} 

 

 

修改一个对象(now),可能会引起其他对象(test)的修改,即:test=getCreateDate();当赋值完毕后,如果需要修改now的值,那么就有问题了!

 

可以修改成注释部分 ,不直接返回this.test,而是返回一个this.test的拷贝。

 

直接运行一下,在解开上的注释,再试试,看看结果!

 

令人深思啊!

 

延伸:

Java复制并按值传递引用,而非对象本身。

1.基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的
2.在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数,相当于赋值传递。 当原引用指向原对象时,方法就能改变原对象的值。如果引用仅是一个副本,则交换函数失效。引用的副本进行了交换,而非原引用。方法被调用后,得到的是没有进行交换的原引用。可以在函数体外对原引用进行交换,以实现成功的交换。

 

总结一下,在JAVA中,当向方法传递一个简单类型时,传递的是一个值(赋值传递) 。当传递的是一个对象时,则按引用传递(把内存中的对象地址赋值给这个对象,我的理解同样是直接把值传递给另一个对象模型相同的对象)

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值