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;
}
означает
- клиент может быть подвержен изменениям в вашем торговом списке
- клиент может изменить этот список, который вы передали добросовестно
таким образом, есть два подходы.
- передать неизменяемые вариант этого объекта (т. е. объект, который нельзя изменить). В приведенном выше сценарии вы возьмете копию этого списка только для чтения и передадите ее (вы можете утверждать, что можете просто взять простую копию для чтения и записи и передать ее, поскольку она не повлияет на исходный объект, но это противоречит интуиции)
- не передавать объект (список сделок), а скорее иметь объект-владелец выполнять операции на эта коллекция для тебя. В этом, пожалуй, и заключается суть ОО -говорить объектам делать что-то для вас, а не просить их о информации и делать это самостоятельно.
аналогичные аргументы относятся к установщикам и аргументам конструктора.
обратите внимание, что вы можете копировать много объектов при экспозиции, чтобы защитить себя, и потенциально делать много дополнительной работы. Это метод, который нужно использовать разумно, и стоит понять, кто ваш объекты клиента, и если вы можете контролировать и/или доверять им.
объект Date имеет setMonth и другие сеттеры для управления значением, где, как и большинство других изменяемых объектов, нет сеттера для изменения его значения (пример Integer не имеет никакого сеттера).
Case 1 :
Date date = obj.getDate();
date.setHours(10);
Case 2 :
Integer i = obj.getI();
i = 10;
Finbug рассматривает только случай 1 как угрозу безопасности.