我正在针对我的模块的代码审核报告修复代码。它说
"Avoid methods that might expose internal representations by returning arrays or other mutable fields"`
现在我的应用程序处于spring mvc框架工作中,并且具有用于业务目的的分层智能结构,并具有实现它们的java类和接口。并且其中很多数据主要是在hibernate pojo java类的getter方法和服务接口对象getter方法中报告的。例如 - 像
这样的hibernate getter方法public Timestamp getAltgendate() {
return this.altgendate;
}
public AltM getAltM() {
return this.altM;
}
服务接口对象,如
public ReportService getReportService() {
return reportService;
}
public PService getPService() {
return pService;
}
这些都是可变的字段和对象....我需要它们来解决目的。那么如何解决这些问题呢?任何建议,任何人!
编辑@下午6:30 完成了很多功课。首先在我的代码中实现java Cloneable接口,如
public Object clone() throws CloneNotSupportedException {
try{
ReportServiceImpl reportServiceImplClone = new ReportServiceImpl();
return reportServiceImplClone;
}catch (Exception e){
logger.error("Deep copy cannot be created due to an exception :", e);
}
return null;
}
我的Impl类中的代码,并通过getter接口在控制器中调用它,如
public ReportService getReportService() {
return (ReportService)reportService.clone();
}
但Cloneable界面克隆并不是那么可靠,因为我从不同的博客和文章以及所有内容中了解到.... 因此,我尝试通过为类成员使用final关键字使类成为不可变,删除setter并使用参数化构造函数初始化服务类对象。但这也是徒劳的,因为我有一个Spring框架体系结构,其中包含服务和servlet以及定义xmls的数据访问对象,我需要使用显式setter进行处理,并对框架提出问题。
现在第三个是使用org.apache.commons.lang.SerializationUtils API来克隆getter方法返回的对象。代码就像
public ReportService getReportService() {
return (ReportService)SerializationUtils.clone((Serializable)reportService);
}
此解决方案也有限制,我从谷歌了解到。
这一直到现在。我需要你真正的建议,我需要实施哪个解决方案,因为它们都有一些缺点和解决问题的优势。 关于关注问题的所有EXPERT评论都欢迎!!!!!!!!! 在此先感谢。