FindBugs EI выставляет ошибку REP только в отношении даты?

Findbugs сообщает много ошибок EI_EXPOSE_REP и EI_EXPOSE_REP2 в моем коде, каждый раз, когда я пишу геттеры и сеттеры, как это:

  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 ответов


Я бы, конечно, ожидал, что этот отчет будет относиться ко всем изменяемым объектам, но я подозреваю, что FindBugs знает о некоторых общих правонарушителях.

Я обычно осторожен с раскрытием внутреннего состояния через геттеры, например

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

означает

  1. клиент может быть подвержен изменениям в вашем торговом списке
  2. клиент может изменить этот список, который вы передали добросовестно

таким образом, есть два подходы.

  1. передать неизменяемые вариант этого объекта (т. е. объект, который нельзя изменить). В приведенном выше сценарии вы возьмете копию этого списка только для чтения и передадите ее (вы можете утверждать, что можете просто взять простую копию для чтения и записи и передать ее, поскольку она не повлияет на исходный объект, но это противоречит интуиции)
  2. не передавать объект (список сделок), а скорее иметь объект-владелец выполнять операции на эта коллекция для тебя. В этом, пожалуй, и заключается суть ОО -говорить объектам делать что-то для вас, а не просить их о информации и делать это самостоятельно.

аналогичные аргументы относятся к установщикам и аргументам конструктора.

обратите внимание, что вы можете копировать много объектов при экспозиции, чтобы защитить себя, и потенциально делать много дополнительной работы. Это метод, который нужно использовать разумно, и стоит понять, кто ваш объекты клиента, и если вы можете контролировать и/или доверять им.


объект Date имеет setMonth и другие сеттеры для управления значением, где, как и большинство других изменяемых объектов, нет сеттера для изменения его значения (пример Integer не имеет никакого сеттера).

    Case 1 :

    Date date =  obj.getDate();        
    date.setHours(10);

    Case 2 :

    Integer i = obj.getI();
    i = 10;

Finbug рассматривает только случай 1 как угрозу безопасности.