当在Java中使用@Override [复制](When to use @Override in j

2019-10-16 18:10发布

可能重复:
当你使用Java的@覆盖批注,为什么?

从的javadoc @Override批注:

表示一个方法声明打算重写超类中的方法声明。 如果一个方法被标注与此注释类型,但不覆盖超类方法中,需要的编译器来生成一个错误消息。

我倾向于使用@Override批注在测试中,当我想测试的类型的具体方法和替换一些我的测试对象调用的其他方法的行为。 我的一个同事是坚定地认为,这不是一个有效的使用,但不知道为什么的。 任何人都可以说明为什么要避免它?

我添加了下面的例子来说明我的使用。

被测试者富:

public class Foo {
    /**
     * params set elsewhere
     */
    private Map<String, String> params;

    public String doExecute(Map<String, String> params) {
        // TODO Auto-generated method stub
        return null;
    }

    public String execute() {
        return doExecute(params);
    }
}

我会这样定义的测试:

public void testDoExecute() {
    final Map<String, String> expectedParams = new HashMap<String, String>();
    final String expectedResult= "expectedResult";
    Foo foo = new Foo() {
        @Override
        public String doExecute(Map<String, String> params) {
            assertEquals(expectedParams, params);
            return expectedResult;
        }
    };

    assertEquals(expectedResult, foo.execute());
}

然后,如果我的doExecute()签名的变化,我会得到我的测试编译错误,而不是一个混乱的执行失败。

Answer 1:

在那种测试使用覆盖注解是完全有效的,但注释必须在所有的测试没有特定的关系; 它可以(也应该)将全部用于对生产的代码。



Answer 2:

@覆盖的目的是,你宣布你的意图重写的方法,这样,如果你犯了一个错误(该方法名如拼写错误,错误的参数类型),编译器可以抱怨,你及早发现你的错误。

因此,这是一个完全有效的使用。



Answer 3:

与-Xlint上进行编译。 它会抱怨在错误的地点失踪@覆盖的或@Overrides。



Answer 4:

@覆盖确保您实际上覆盖的方法,而不是偶然超载的,以及编译器警告帮助您确定是否推翻你打算重载方法。

在这种情况下使用是完全合法的,但考虑到它是一个测试,如果你超载,而不是重写它(比如改变方法签名)的方法测试失败,所以也许它不是在这种情况下非常重要。



文章来源: When to use @Override in java [duplicate]