在编写JavaBean时,如果类内部的成员变量为一个对象类型,用FindBugs扫描后可能会产生如下警告:
com.digu.api.db.model.HuotuSnsUserModel.getAddDate() may expose internal representation by returning HuotuSnsUserModel.addDate
public class StudentBean
{
private Date addDate;
public Date getAddDate()
{
return addDate;
}
public void setAddDate(Date addDate)
{
this.addDate = addDate;
}
}
为消除警告,可以进行如下修改:
public class StudentBean
{
private Date addDate;
public Date getAddDate()
{
if (addDate == null)
{
return null;
}
return (Date)addDate.clone();
}
public void setAddDate(Date addDate)
{
if (addDate == null)
{
this.addDate = null;
} else {
this.addDate = (Date)addDate.clone();
}
}
}
问题# 为什么要这样做呢?在网上搜到了答案是:
生成的引用类型(Object、数组、Date等)的getter、setter方法会得到或通过对可变对象的引用操作而暴露代码内部实现,解决方法很多,只要返回的或赋值的对象不是原引用对象即可。
其中 :生成的引用类型(Object、数组、Date等)的getter、setter方法会得到或通过对可变对象的引用操作而暴露代码内部实现 ----- 这个暴露代码内部实现是什么意思?为什么调用setter,gettter会暴露代码内部实现呢?可以举个例子吗?
暴露内容实现,可能会被意外修改,这与您的设计意图可能不一致. 如:
如果你不在乎, 也可以忽略.