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中,当向方法传递一个简单类型时,传递的是一个值(赋值传递) 。当传递的是一个对象时,则按引用传递(把内存中的对象地址赋值给这个对象,我的理解同样是直接把值传递给另一个对象模型相同的对象)

 

 

### 关于视图、SQLite 和 Docker 的综合解析 在流处理场景下,物化视图的作用在于提供一种高效的数据查询方式。具体而言,视图定义了一种逻辑上的数据表示形式,而物化视图则进一步将其存储为实际的物理数据结构[^1]。这种设计使得查询操作能够直接作用于预计算的结果集上,从而显著提升性能。 对于 SQLite 数据库,在 NDK 层面运行时的行为也值得关注。当系统启动后,SQLite 实例会对 journal 文件的存在状态进行检测。如果此文件未能被正常清理,则可能导致数据库进入只读模式。这一现象可能源于不同版本间的兼容性问题,或者由于某些外部条件干扰了正常的垃圾回收流程[^2]。 至于 Docker 镜像管理方面,`docker images` 是用于列举当前环境中已存在镜像的有效命令。通过基于 Dockerfile 构建自定义基础镜像的方式,可以实现更灵活的应用部署方案。例如,“micro base image”的创建过程便是典型的一环[^3]。 以下是 Python 脚本的一个简单例子来展示如何调用 `subprocess` 执行 `docker images` 命令并捕获输出: ```python import subprocess def list_docker_images(): result = subprocess.run(['docker', 'images'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) if result.returncode != 0: raise Exception(f"Error occurred while listing docker images: {result.stderr}") return result.stdout.splitlines() for line in list_docker_images(): print(line) ``` ####
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值