Рубрики
Без рубрики

Эффективная Java! Последовательно используйте аннотацию Переопределения

Погружение в главу 39 Эффективной Java. Помечено как java, эффективный, аннотация, архитектура.

В нашей предыдущей главе мы обсуждали создание аннотаций, что было очень весело, но не то, что многие разработчики будут делать изо дня в день. Сегодня мы обсудим то, с чем вы будете взаимодействовать гораздо чаще. Это аннотация |/@Override . Эта аннотация довольно проста, но поможет избежать некоторых ошибок и перенесет обнаружение некоторых наших дефектов на время компиляции, а не на более поздний этап процесса. Чтобы проиллюстрировать это, давайте рассмотрим следующий пример:

public class Bigram {
  private final char first;
  private final char second;

  public Bigram(char first, char second) {
    this.first = first;
    this.second = second;
  }

  public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
  }

  public hashcode() {
    return 31 * first + second;
  }

  public static void main(String[] args) {
    Set s = new HashSet<>();
    for (int i = 0; i < 10; i++) {
      for (char ch = 'a'; ch <= 'z'; ch++) {
        s.add(new Bigram(ch, ch));
      }
    }
    System.out.println(s.size());
  }
}

Этот код перебирает строчный алфавит и добавляет в набор два символа того же типа, что и Bigram . Он повторяет эту операцию десять раз. Видя, что он делает одно и то же снова и снова и помещает результаты в набор, а дубликаты не могут быть помещены в набор, вы, вероятно, ожидаете, что размер будет 26, но на самом деле в итоге получается 260 элементов. Можете ли вы определить, почему было разрешено вставлять дубликаты? Автор этого кода, несомненно, намеревался переопределить базовый класс Объект ‘s равен функции, но, к сожалению, испортил подпись. Это связано с тем, что автор в конечном итоге переопределил функцию equals , а не переопределил ее. Чтобы переопределить его, функция должна принимать Object , а не Bigram .

Именно здесь может быть использована аннотация @Override . Если бы автор кода поместил эту аннотацию на метод во время компиляции, компилятор выдал бы ошибку, сообщающую, что не существует метода для переопределения.

Во время начальной компиляции вы получаете большую часть преимуществ аннотации @Override ; однако она все еще может быть полезна и помимо этого. Ваша среда разработки IDE также может использовать эту информацию для добавления информации в ваш код и оказания вам помощи в безопасной разработке. Наконец, его можно использовать для общения с будущими разработчиками о том, какие методы переопределяются, а какие нет.

Таким образом, когда мы переопределяем функцию, мы всегда должны аннотировать ее с помощью аннотации @Override . Это обеспечит вам лучшую безопасность и документирование классов, которые вы пишете.

Оригинал: “https://dev.to/kylec32/effective-java-consistently-use-the-override-annotation-10lo”