有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java FindBugs EI_EXPOSE_REP bug是否只关注日期?

Findbugs在我的代码中报告了很多EI_EXPOSE_REP和EI_EXPOSE_REP2 bug,每次我编写getter和setter时都是这样:

  public Date getDate() {
    return date;
  }
  public void setDate(final Date date) {
    this.date = date;
  }

我理解报告的含义,我不应该将我的对象的内部引用暴露给外部世界,这样它们就不会被恶意/恶意代码修改。解决办法是:

  public Date getDate() {
    return date == null ? null : date.clone();
  }
  public void setDate(Date date) {
    this.date = date == null ? null : date.clone();
  }

我的问题不在这里。我很惊讶这份报告总是涉及日期。为什么不是所有其他可变对象?我认为这个报告也适用于所有可变对象,不是吗

我是否应该将这个“良好实践”扩展到所有处理可变对象的访问器

给我你的建议,谢谢


共 (2) 个答案

  1. # 1 楼答案

    Date对象有setMonth和其他setter来操作值,而大多数其他可变表都没有setter来更改其值(例如Integer没有任何setter)

        Case 1 :
    
        Date date =  obj.getDate();        
        date.setHours(10);
    
        Case 2 :
    
        Integer i = obj.getI();
        i = 10;
    

    Finbug只将案例1视为安全威胁

  2. # 2 楼答案

    我当然希望这份报告涉及所有可变对象,但我怀疑FindBugs知道某些常见的违规者

    我通常会小心地通过getter暴露内部状态,例如

    public ArrayList<Trade> getTrades() {
       return trades;
    }
    

    意味着

    1. 客户可能会面临交易清单的变化
    2. 客户可能会更改您善意发布的列表

    因此,有两种方法

    1. 传递该对象的不可变变体(即无法更改的对象)。在上面的场景中,您可以获取该列表的只读副本并将其传递出去(您可能会说,您可以只获取一个简单的读写副本并传递它,因为它不会影响原始对象,但这是违反直觉的)
    2. 不要传递对象(交易列表),而是让拥有对象为您在该集合上执行操作。这也许是OO的精髓所在,告诉对象为你做事,而不是向他们索取信息,然后自己动手

    类似的参数与setter和constructor参数有关

    请注意,为了保护自己,你会发现自己在曝光时复制了很多物体,并且可能会做很多额外的工作。这是一种明智使用的技术,值得了解客户机对象是谁,以及您是否可以控制和/或信任他们