我最近在一次采访中被问到这个问题:
你可以在Java API中命名任何不应该是最终的类,或者那个不应该且应该是'的类吗?
我什么都想不到.这个问题意味着我应该知道所有的API类,比如我的手,我个人不希望任何Java开发人员知道.
如果有人知道任何此类课程,请提供示例.
我针对我的所有代码运行findbugs,只解决了最重要的问题.我终于解决了最重要的问题,现在我正在查看细节.我有一个简单的实体,比如一个用户:
public class User implements Serializable
{
protected Date birthDate;
public Date getBirthDate()
{return(birthDate);}
public void setBirthDate(final Date birthDate)
{this.birthDate = birthDate;}
}
Run Code Online (Sandbox Code Playgroud)
这个课程是不完整的,所以不要因为它错过了它serialVersionUID和其他标准的东西,我只关心birthDate安全漏洞.
现在,根据findbugs报告,由于我返回对可变对象的引用,这是一个潜在的安全风险.但在实践中,这究竟有多重要?
http://findbugs.sourceforge.net/bugDescriptions.html#EI_EXPOSE_REP
我想在这种情况下我仍然没有真正看到问题所在.我应该通过long并设置日期吗?
沃尔特
我有一个Java gettor方法,如下所示:
import java.util.Date;
//...
public Date getSomeDate() {
return someDate;
}
Run Code Online (Sandbox Code Playgroud)
和Findbugs报告这暴露了一个可变对象:"可以通过返回对可变对象的引用来公开内部表示".我将代码更改为:
import java.util.Date;
//...
public Date getSomeDate() {
return new Date(someDate.getTime());
}
Run Code Online (Sandbox Code Playgroud)
但Findbug仍然报告相同的漏洞.我还能做些什么来抑制/解决这个问题?我在IntellJ 10 Findbugs插件中运行Findbugs 1.3.9.
我在项目中运行了FindBugs,并收到以下警告:
new foo.pkg.Key(Client, Product, Date, String) may expose internal representation by storing an externally mutable object into Key.expireDate MALICIOUS_CODE EI_EXPOSE_REP2 60 Medium
Run Code Online (Sandbox Code Playgroud)
Key是一个实体,它有一个Date expireDate带有各自的getter和setter 的实体,它在构造函数中使用它们.
那么,怎么了?为什么这到底是错的?是因为Date是一个可变类型吗?
实际上,我只是返回一个(Date) dataNascimento.clone(),并在setter中使用相同的策略.这是更好的方法吗?