Findbugs不会检测用户定义的类对内部表示的公开

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标准库类,而不检查用户定义的类?有办法控制吗?

def*_*ale 5

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.Datejava.sql.Datejava.sql.Timestamp);
  • 数组

Findbugs甚至不会为列表和集合产生此警告。