понедельник, 12 ноября 2007 г.

Java Puzzle 58: Making a Hash of It

В этой задаче (продолжение предыдущей) авторы добавили метод hashCode(), однако поменяли тип параметра метода equals() с Object на имя класса, используемого в качестве элемента множества HashSet. Естественно, что никакого переопределения не происходит, а происходит перегрузка методов.

В языке Java перегрузка разрешена, но приводит к ошибкам и неразберихе. Читаем секцию 26 все той же необходимой к прочтению книги Effective Java. Начиная с версии Java 5 появилась аннотация @Override, которую авторы рекомендуют использовать. Я, например, включил в IDEA опцию, которая автоматически добавляет эту аннотацию при переопределении метода. Если в супер классе метод поменяет сигнатуру (всякое бывает), то не возникнет скрытого бага - проект просто не скомпилируется и вы найдете проблему за 5 секунд.

2 комментария:

  1. Вот тут я уже не копенгаген. СЭМми, а вот зачем вообще эти аннотации нужны? И как наличие аннотации к методу мешает компиляции при изменении сигнатуры?
    Где почитать-то можно?

    ОтветитьУдалить
  2. Аннотации введены, чтобы помечать языковые элементы типа классов, полей и методов. Просто некоторая METADATA информация, которая может использоваться различными средствами, например IDE, для своих собственных нужд.
    http://java.sun.com/javase/6/docs/technotes/guides/language/annotations.html

    Аннотация @Override используется java-компилятором Sun, который просекает фишку, что метод не переопределяет метод, а перегружает или вовсе является новым. Если ты поставил эту аннотацию методу, ты ожидаешь, что твой метод переопределяет некий метод суперкласса. Сведовательно, компилятор генерирует ошибку, если метод не переопределяет его.
    http://java.sun.com/javase/6/docs/api/java/lang/Override.html

    Например, IDEA имеет собственные аннотации @Nullable и @NotNull, которые говорят, что метод может вернуть null или нет. IDEA при анализе кода проверяет места, где значение берется из метода и не проверяет на null и помечает код желтым warning.

    ОтветитьУдалить