Ale*_*ndr 2 java findbugs immutability
当在类定义中有可变的私有字段,并且公开它们的getter / setter时,我们得到的异常如下所示:
[INFO] path.getInsertDate() may expose internal representation by returning Ttt.insertDate path.Ttt] At Ttt.java:[line 119]
Run Code Online (Sandbox Code Playgroud)
我添加了一个可变的类:
public class Test {
public String test;
}
Run Code Online (Sandbox Code Playgroud)
添加了此Test类和getters / setter方法的私有字段。但是finbugs很喜欢它。
public class ExposingTest {
private Test test;
//No warning here.
public Test getTest() {
return test;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么对于此警告,Findbugs仅检查Java标准库类,而不检查用户定义的类?有办法控制吗?
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;
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,如果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) == '[';
}
Run Code Online (Sandbox Code Playgroud)
因此,Findbugs将为返回的方法生成这种类型的警告(内部表示公开):
java.util.Date,java.sql.Date,java.sql.Timestamp);Findbugs甚至不会为列表和集合产生此警告。
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |