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

时间:2015-08-11 05:15:54

标签: java immutability findbugs

当在类定义中有可变的私有字段,以及暴露它们的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标准库类,而不检查用户定义的类?有没有办法控制这个?

2 个答案:

答案 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.Datejava.sql.Datejava.sql.Timestamp);
  • 阵列

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

答案 1 :(得分:0)

我想你在path.getInsertDate()中使用java.util.Date作为返回类型 字符串,原始包装(Long,Short,...)是不可变对象。它是安全的回报并分享它们。但是Date是不同的商店。它有变异的方法。它通过引入新的Joda API在Java 8中修复。您可以:   - 迁移到新的API   - 忽略此警告   - 每次都返回新的Date对象   - 返回日期