Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您何时使用Java';s@Override注释,为什么?_Java_Annotations - Fatal编程技术网

您何时使用Java';s@Override注释,为什么?

您何时使用Java';s@Override注释,为什么?,java,annotations,Java,Annotations,使用Java的@Override注释的最佳实践是什么?为什么 用@Override注释标记每个被重写的方法似乎有些过分。是否存在需要使用@Override的特定编程情况,以及不应使用@Override的其他编程情况 我每次都用它。当我在一年内重温代码时,我已经忘记了我第一次想的是什么,我可以使用更多的信息来快速了解发生了什么。我总是使用标签。它是一个简单的编译时标志,用来捕捉我可能犯的小错误 它将捕获类似于tostring()的内容,而不是tostring() 小东西在大型项目中很有帮助。每当一

使用Java的
@Override
注释的最佳实践是什么?为什么


@Override
注释标记每个被重写的方法似乎有些过分。是否存在需要使用
@Override
的特定编程情况,以及不应使用
@Override
的其他编程情况

我每次都用它。当我在一年内重温代码时,我已经忘记了我第一次想的是什么,我可以使用更多的信息来快速了解发生了什么。

我总是使用标签。它是一个简单的编译时标志,用来捕捉我可能犯的小错误

它将捕获类似于
tostring()
的内容,而不是
tostring()


小东西在大型项目中很有帮助。

每当一个方法重写另一个方法,或者一个方法在接口中实现签名时


@Override
注释确保您确实覆盖了某些内容。如果没有注释,您可能会出现拼写错误或参数类型和编号不同的风险。

它确实允许您(嗯,编译器)在覆盖的方法名称上使用错误的拼写时进行捕获。

每次覆盖方法时使用它有两个好处。这样做,您就可以利用编译器检查来确保您实际上正在重写一个您认为是的方法。这样,如果您犯了一个常见的错误:拼写错误的方法名或与参数不正确匹配,您将收到警告,您的方法实际上并没有像您认为的那样重写。其次,它使您的代码更容易理解,因为当方法被覆盖时,代码更容易理解


此外,在Java1.6中,您可以使用它来标记方法何时实现接口以获得相同的好处。我认为最好有一个单独的注释(如
@Implements
),但总比什么都没有好。

使用
@Override
注释作为编译时保护措施,防止常见的编程错误。如果在一个方法上有注释,而实际上没有重写超类方法,则会引发编译错误


最常见的情况是,当您更改基类中的方法以具有不同的参数列表时,这一点非常有用。子类中用于重写超类方法的方法将不再这样做,因为方法签名已更改。这有时会导致奇怪和意外的行为,特别是在处理复杂的继承结构时。
@Override
注释可以防止这种情况。

如果您发现自己经常重写(非抽象)方法,您可能想看看您的设计。当编译器无法捕获错误时,它非常有用。例如,尝试在ThreadLocal中重写initValue(),我已经这样做了


在实现接口方法(1.6+特性)时使用@Override对我来说似乎有点过头了。如果你有大量的方法,其中一些覆盖,而另一些不覆盖,那么这可能又是一个糟糕的设计(如果你不知道,你的编辑器可能会显示哪个是哪个)。

最好的做法是始终使用它(或者让IDE为你填充它们)

@重写有用性是检测父类中未在层次结构中报告的更改。 如果没有它,您可以更改方法签名并忘记更改其重写,使用@Override,编译器将为您捕获它


拥有这种安全网总是很好的。

我认为它是最有用的编译时提醒,该方法的目的是重写父方法。例如:

protected boolean displaySensitiveInformation() {
  return false;
}
您经常会看到类似上述方法的内容,它重写基类中的方法。这是这个类的一个重要实现细节——我们不希望显示敏感信息

假设此方法在父类中更改为

protected boolean displaySensitiveInformation(Context context) {
  return true;
}
此更改不会导致任何编译时错误或警告,但会完全更改子类的预期行为


回答您的问题:如果超类中缺少具有相同签名的方法表示存在bug,则应使用@Override注释

@对接口的覆盖实际上是有帮助的,因为如果您更改接口,将收到警告。

我在任何地方都使用它。 关于标记方法的工作主题,我让Eclipse为我做了这件事,所以不需要额外的工作


我信奉持续重构。。。。因此,我将使用每一件小事来让它更顺利。

最好将它用于每个用作重写的方法,以及Java 6+,每个用作接口实现的方法

首先,它在编译时捕获诸如“
hashcode()
”之类的拼写错误,而不是“
hashcode()
”。调试为什么方法的结果与代码不匹配,而真正的原因是代码从未被调用,这可能会让人感到困惑


此外,若一个超类更改了一个方法签名,那个么旧签名的重写可能会“孤立”,留下混乱的死代码。
@Override
注释将帮助您识别这些孤立项,以便对它们进行修改以匹配新签名。

这里有许多很好的答案,因此让我提供另一种方法来查看它


当你编码的时候,没有多余的工作。键入@override不需要花费任何成本,但是如果您拼写错误了方法名或签名有点错误,则可以节省大量成本

这样想吧:在你浏览这里并键入这篇文章的时候,你用的时间远远超过了你余生键入@override的时间;但它防止的一个错误可以节省您的时间

Java尽其所能确保您在编辑时没有犯任何错误
someUIComponent.addMouseListener(new MouseAdapter(){
  public void mouseEntered() {
     ...do something...
  }
});
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());
    }
}