Редактор шаблонов для защитного программирования - PullRequest
8 голосов
/ 17 декабря 2008

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

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

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

Чтобы создать копию массива для возврата из метода:

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

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

(${o}!= null?(${type})${o}.clone():null)

Ответы [ 2 ]

3 голосов
/ 17 декабря 2008

Мне нравится иметь в качестве шаблона определение "безопаснее" 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;
}

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

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

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


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

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

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

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

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

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

...