博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
findbugs:may expose internal representation by ret
阅读量:6501 次
发布时间:2019-06-24

本文共 2673 字,大约阅读时间需要 8 分钟。

hot3.png

findbugs:

1. *** getXXX() may expose internal representation by returning ***.getXXX 
2. *** setXXX(DATE )may expose internal representation by storing an externally mutable object into setXXX ***
翻译:
1. getXXX()这个返回数据的方法可能会暴露内部的实现,也就是影响原本对象内部的数据安全。 
2. setXXX(DATE)方法这个设置属性值的方法可能会暴露内部的实现,也会影响原本对象内部的数据安全。 
分析:
上述findbugs的bug常出现在JavaBean中的setXXX(Object)、getXXX()、构造方法等中,原因都是一个,类似数组、Date等和其他所有java对象一样传递的都是引用,当你外部改变了这些引用值的时候,显然会影响使用这些引用的JavaBean。 
解决: 
所有的对象型如数组、Date等都人为采用传值(并增加空逻辑判断)。

public Date getDate() {    if(date == null) {        return null;    }    return (Date) date.clone();  }  public void setDate(Date date) {     if(date == null) {        this.date = null;    }else {        this.date = (Date) date.clone();    }  }

举例: 

一个JavaBean中定义了如下属性和getXXX(),setXXX(),构造方法:

Java代码

package com.bijian.study;import java.util.Date;import java.util.concurrent.TimeUnit;public class Message {    private String[] messages;      private Date date;            public Message(String[] messages, Date date) {          this.messages = messages;          this.date = date;      }            public void setMessages(String[] messages) {          this.messages = messages;      }            public String[] getMessages() {          return messages;      }      public Date getDate() {          return date;      }      public void setDate(Date date) {          this.date = date;      }          @SuppressWarnings("deprecation")    public static void main(String[] args) throws InterruptedException {          String[] msg = new String[]{"msg1","msg2"};          Message message = new Message(msg,  new Date());          System.out.println("原本date\t"+message.getDate());                    /* getXXX() */        Date date2 = message.getDate(); // 获取引用          date2.setHours(2);              // 更改引用          System.out.println("getXXX()后\t"+message.getDate());                    /* setXXX() */        TimeUnit.SECONDS.sleep(2);          Date date3 = new Date();          message.setDate(date3);         // 主动更改          System.out.println("主动更改date\t"+message.getDate());          date3.setHours(2);              // 更改date3的值,看引用这个值的数据是否会编号          System.out.println("setXXX()后\t"+message.getDate());                    /* Constructor() */          System.out.println("\r\n原本message\t"+message.getMessages()[0]);          msg[0] = "mofify-msg1";          System.out.println("构造对象的数组来源引用发生改变\t"+message.getMessages()[0]);      }}

 运行结果:

Text代码

原本date	Mon Nov 25 19:41:10 CST 2013getXXX()后	Mon Nov 25 02:41:10 CST 2013主动更改date	Mon Nov 25 19:41:12 CST 2013setXXX()后	Mon Nov 25 02:41:12 CST 2013原本message	msg1构造对象的数组来源引用发生改变	mofify-msg1

参考:

转载于:https://my.oschina.net/jerryhu/blog/286039

你可能感兴趣的文章
Selenium的延迟等待
查看>>
jquery 1.6以上版本 全选
查看>>
AppCan 学习
查看>>
flask框架
查看>>
《疯狂Java讲义》学习笔记(十)异常处理
查看>>
Lua(Codea) 中 table.insert 越界错误原因分析
查看>>
ELK 5.x日志分析 (二) Elasticserach 5.2 安装
查看>>
sbt配置nexus仓库
查看>>
一次奇怪的AP注册异常问题处理
查看>>
TableStore: 海量结构化数据分层存储方案
查看>>
Unity 4.x游戏开发技巧集锦(内部资料)
查看>>
自适应网页设计
查看>>
获取BT节点信息bittorrent-discovery
查看>>
环形动画加载视图AnimatedCircleLoadingView
查看>>
Centos 7使用vsftpd搭建FTP服务器
查看>>
tcpdump抓包文件提取http附加资源
查看>>
linux下SVN不允许空白日志提交
查看>>
第2周第1课
查看>>
docker制作镜像篇(基于容器)
查看>>
山寨c 标准库中的getline 函数
查看>>