Findbugs 未检测到用户定义的内部表示公开 类
Findbugs doesn't detect exposing of the internal representation by user-defined classes
当在 class 定义中有可变私有字段,并且 getters/setters 公开它们时,我们得到如下异常:
[INFO] path.getInsertDate() may expose internal representation by returning Ttt.insertDate path.Ttt] At Ttt.java:[line 119]
我添加了一个可变的 class:
public class Test {
public String test;
}
添加了此测试的私有字段 class 和 getters/setters。但是 finbugs 忽略了它。
public class ExposingTest {
private Test test;
//No warning here.
public Test getTest() {
return test;
}
}
为什么这个警告 Findbugs 只检查 java 标准库 classes,而不检查用户定义的 classes?有办法控制吗?
TL;DR Findbugs 为一组预定义的 classes 生成此警告。
Findbugs 的目的是警告开发人员注意代码的潜在问题。 Findbugs 不检查不变性。
Mutable class 本身不是错误或问题。可变 class 可能是一个有效的设计选择。
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 开始对每个可变 class 生成警告,那将是非常烦人的。
而不是这个,Findbugs 试图找到潜在的问题,可变的 classes 开发人员往往会忽略。这是 Findbugs 用来检测有问题的可变 classes 的方法(在 class 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 将为 return 的方法生成此类警告(内部表示公开):
- 哈希表;
- 日期(
java.util.Date
、java.sql.Date
、java.sql.Timestamp
);
- 数组
Findbugs 甚至不会为列表和集生成此警告。
我想你使用 java.util.Date 作为 return 输入 path.getInsertDate()
字符串、原始包装器(Long、Short 等)是不可变对象。它是安全的 return 并分享它们。但日期是不同的商店。它有变异的方法。它通过引入新的 Joda API 在 Java 8 中得到修复。你可以:
- 迁移到新的 API
- 忽略此警告
- return 每次都有新的日期对象
- return 日期
当在 class 定义中有可变私有字段,并且 getters/setters 公开它们时,我们得到如下异常:
[INFO] path.getInsertDate() may expose internal representation by returning Ttt.insertDate path.Ttt] At Ttt.java:[line 119]
我添加了一个可变的 class:
public class Test {
public String test;
}
添加了此测试的私有字段 class 和 getters/setters。但是 finbugs 忽略了它。
public class ExposingTest {
private Test test;
//No warning here.
public Test getTest() {
return test;
}
}
为什么这个警告 Findbugs 只检查 java 标准库 classes,而不检查用户定义的 classes?有办法控制吗?
TL;DR Findbugs 为一组预定义的 classes 生成此警告。
Findbugs 的目的是警告开发人员注意代码的潜在问题。 Findbugs 不检查不变性。
Mutable class 本身不是错误或问题。可变 class 可能是一个有效的设计选择。
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 开始对每个可变 class 生成警告,那将是非常烦人的。
而不是这个,Findbugs 试图找到潜在的问题,可变的 classes 开发人员往往会忽略。这是 Findbugs 用来检测有问题的可变 classes 的方法(在 class 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 将为 return 的方法生成此类警告(内部表示公开):
- 哈希表;
- 日期(
java.util.Date
、java.sql.Date
、java.sql.Timestamp
); - 数组
Findbugs 甚至不会为列表和集生成此警告。
我想你使用 java.util.Date 作为 return 输入 path.getInsertDate() 字符串、原始包装器(Long、Short 等)是不可变对象。它是安全的 return 并分享它们。但日期是不同的商店。它有变异的方法。它通过引入新的 Joda API 在 Java 8 中得到修复。你可以: - 迁移到新的 API - 忽略此警告 - return 每次都有新的日期对象 - return 日期