@ override аннотация - PullRequest
       0

@ override аннотация

19 голосов
/ 01 апреля 2011

Нужно ли ставить аннотацию @Override при реализации интерфейса (не переопределяя абстрактный класс)?

А что дает @Override аннотация?

Ответы [ 6 ]

21 голосов
/ 01 апреля 2011

В Java 5 вы не должны добавлять @Override при реализации метода, унаследованного от интерфейса, в Java 6 вы должны (или вы получите предупреждение компилятора).

@Override утверждает, что метод предназначен для переопределения чего-либо, и заставит компилятор уведомить вас, если это не так или больше не так, например, потому что переопределяемый метод был переименован.

18 голосов
/ 01 апреля 2011

Это нарушает компиляцию, если вы говорите, что переопределяете что-то, когда на самом деле этого не сделали.

Если вы не добавили тег @Override, но, согласно компилятору, вы ничего не переопределили, выесть молчаливая ошибка, о которой вы не знаете.С тэгом @Override вы знаете об этом и знаете об этом СЕЙЧАС, а не позже.

Вы НИКОГДА НЕ НУЖНЫ , чтобы добавить аннотацию @Override.Но я бы рекомендовал делать это каждый раз.

8 голосов
/ 01 апреля 2011

Аннотация @Override информирует компилятор о том, что элемент предназначен для переопределения элемента, объявленного в суперклассе.

Это не обязательно, но генерирует ошибку компиляции, если этот метод на самом деле не корректно переопределяет метод в суперклассе.

7 голосов
/ 01 апреля 2011

@override в основном заставляет компилятор проверить, что вы действительно переопределяете существующий метод базового класса, а не просто (случайно) создаете новый метод.

2 голосов
/ 07 декабря 2013

Рекомендуется всегда использовать @Override, поскольку это может помочь вам упреждающе ловить некоторые в противном случае коварные ошибки. Это также повышает четкость кода. Например, посмотрите пример, приведенный в Effective Java , глава 6, пункт № 36:

// Can you spot the bug? - Page 176
package org.effectivejava.examples.chapter06.item36;

import java.util.HashSet;
import java.util.Set;

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 int hashCode() {
        return 31 * first + second;
    }

    public static void main(String[] args) {
        Set<Bigram> s = new HashSet<Bigram>();
        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());
    }
}

На первый взгляд, этот метод может выглядеть прекрасно, но на самом деле он очень плохой! Программист не следовал контракту equals(Object o), вместо этого реализовав equals(Bigram b), который будет не вызываться при выполнении действий, зависящих от equals(); т.е. вставка экземпляров Bigram в Map. Таким образом, это приведет к запутанному, тонкому неправильному поведению, которое будет трудно отследить, тогда как если бы программист просто использовал @Override, компилятор немедленно предупредил бы их о проблеме.

0 голосов
/ 10 октября 2014

НЕТ, Java не обязывает вас добавлять аннотацию @Override при реализации интерфейса. Вы можете переопределить методы, объявленные в интерфейсе, как мы обычно делаем. Но хорошей практикой является использование аннотации @Override при переопределении методов интерфейса или любого родительского класса, включая абстрактный класс. Зачем? Потому что это помогает нам / компилятору определить любую проблему в переопределении метода при самой компиляции.

Например: http://java -dive.blogspot.in /

 class Ball{
        public void bounce(){
        }
        } 

//////////////////////Override without @Override/////////////////////////////

    public class FootBall{
    public void bounce(String s){
    }
    }

//this will compile however new FootBall().bounce(); will call parent method.

//////////////////////Override with @Override/////////////////////////////

    public class FootBall{
    @Override
    public void bounce(String s){
    }
    }

//This will not compile as the parent class doent have any method with signature bounce(String s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...