Вопрос

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

Какой из них вы создали для поддержки защитного программирования и хотите поделиться им с аудиторией SO?

Шаблоны, которые я создал до сих пор (в качестве примеров):

Чтобы создать копию массива, возвращаемого из метода:

final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );

Чтобы клонировать объект:

(${o}!= null?(${type})${o}.clone():null)
Это было полезно?

Решение

Мне нравится иметь в качестве шаблона "более безопасное" определение equals():

 /**
 * Implement equals based on ${cursor}. <br />
 * See {@link #compareTo(Object) compareTo}
 * @see java.lang.Object#equals(java.lang.Object)
 */
public boolean equals(final Object anObject)
{
    boolean res = false;
    if(anObject == null) { return false; }
    if(anObject == this) { return true; }
    if(anObject.getClass() == this.getClass())
    {
        res = this.compareTo(anObject) == 0;
    }
    return res;
}

Быть уверенным, что всегда следует избегать Эквалайзер:метод equals переопределяет equals в суперклассе и может быть не симметричным (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC), где:

Этот класс определяет метод equals, который переопределяет метод equals в суперклассе.Оба метода equals методы используют instanceof для определения того, равны ли два объекта.

Это сопряжено с опасностью, поскольку важно, чтобы метод equals был симметричным (другими словами, a.equals(b) == b.equals(a)).
Если B является подтипом A, и Aметод equals проверяет, что аргумент является instanceof A, и метод equals B проверяет , что аргумент является instanceof B, вполне вероятно, что отношение эквивалентности, определенное этими методами, не является симметричным.


Это только для классов , реализующих Comparable и допускает:

  • реализация equals, которая всегда одна и та же;
  • вся логика сравнения должна быть размещена только в одном месте ( compareTo() функция);
  • соответствие javadoc требованиям Comparable#compareTo() прошу обеспечить, чтобы (x.compareTo(y)==0) == (x.equals(y)) (настоятельно рекомендуется, но, тем не менее, не является строго обязательным).

Другие советы

Не шаблон, но я использую array.clone() вместо того , чтобы System.arraycopy().Есть ли в этом что-то неправильное?

Редактировать:Шаблон, который я использую при реализации декоратора, особенно для интерфейса со многими методами:

wrapped.${enclosing_method}(${enclosing_method_arguments})

Он генерирует реализацию текущего метода, делегируя вызов обернутому экземпляру, таким образом предотвращая ошибки копирования / вставки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top