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

标签 java immutability findbugs

当类定义中有可变私有(private)字段以及公开它们的 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;
}

添加了此测试类的私有(private)字段和 getters/setters。但鳍虫却无视它。

public class ExposingTest { 
    private Test test;

    //No warning here.
    public Test getTest() {
         return test;
    } 
}

为什么出现此警告 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;
    }
}

对我来说,如果 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 甚至不会为列表和集合生成此警告。

关于java - Findbugs 不会检测到用户定义的类对内部表示的暴露,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31933723/

相关文章:

maven - Jenkins 构建失败 - Sonar Maven

android - 如何使用 gradle 脚本生成 findbugs 报告?

c# - 自动生成不可变类和匹配的构建器类

java - .NET Dictionary/IDictionary 的 Equals() 契约(Contract)与 Java Map 的 equals() 契约(Contract)

java - 使用 toString 与字符组成字符串

java - 将比较器传递给 java Collections.disjoint

javascript - Array.map() 的函数式编程

java - Findbugs 显示 "BIT_ADD_OF_SIGNED_BYTE"错误

java - 在 Intellij 中使用测试 jar 进行 Spring Boot

java - 如何从方法中正确处理异常?