当在类定义中有可变的私有字段,以及暴露它们的getter / setter时,我们得到异常,如下所示:
[INFO] path.getInsertDate() may expose internal representation by returning Ttt.insertDate path.Ttt] At Ttt.java:[line 119]
我添加了一个可变类:
public class Test {
public String test;
}
添加了此Test类的私有字段和getter / setter。但是,鳍虫进入它。
public class ExposingTest {
private Test test;
//No warning here.
public Test getTest() {
return test;
}
}
为什么这个警告Findbugs只检查java标准库类,而不检查用户定义的类?有没有办法控制这个?
答案 0 :(得分:4)
TL; DR Findbugs会为预定义的一组类生成此警告。
Findbugs的目的是警告开发人员潜在的代码问题。 Findbugs不会检查不变性。
可变类本身,不是错误或问题。可变类可能是有效的设计选择。
public class Person {
private Department dep;
public void setDepartment(Department dep) {
this.dep = dep;
}
}
public class Department {
private String name;
public void setName(String name) {
this.name = name;
}
}
对我而言,如果Findbugs开始在每个可变类上产生警告,那将是非常烦人的。
而不是这样,Findbugs试图找到潜在的问题,开发人员往往会忽略的可变类。以下是Findbugs用于检测有问题的可变类的方法(在类edu.umd.cs.findbugs.detect.MutableStaticFields
中):
static boolean mutableSignature(String sig) {
return sig.equals("Ljava/util/Hashtable;") ||
sig.equals("Ljava/util/Date;") ||
sig.equals("Ljava/sql/Date;") ||
sig.equals("Ljava/sql/Timestamp;") ||
sig.charAt(0) == '[';
}
因此,Findbugs将为返回的方法生成此类警告(内部表示暴露):
java.util.Date
,java.sql.Date
,java.sql.Timestamp
); Findbugs甚至不会为列表和集合生成此警告。
答案 1 :(得分:0)
我想你在path.getInsertDate()中使用java.util.Date作为返回类型 字符串,原始包装(Long,Short,...)是不可变对象。它是安全的回报并分享它们。但是Date是不同的商店。它有变异的方法。它通过引入新的Joda API在Java 8中修复。您可以: - 迁移到新的API - 忽略此警告 - 每次都返回新的Date对象 - 返回日期