何时在java中使用@Override

时间:2009-07-01 13:29:37

标签: java unit-testing annotations

  

可能重复:
  When do you use Java’s @Override annotation and why?

来自@Override注释的javadoc:

  

表示方法声明是   旨在覆盖方法   在超类中声明。如果一个   方法用这个注释   注释类型但不覆盖   一个超类方法,编译器是   需要生成错误消息。

当我想测试类型的特定方法并替换我的测试主题调用的其他方法的行为时,我倾向于在测试中使用@Override注释。我的一位同事坚信,这不是一个有效的用途,但不确定原因。任何人都可以建议为什么要避免它?

我在下面添加了一个示例来说明我的用法。

对于测试对象Foo:

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()签名发生变化,我的测试会出现编译错误,而不是令人困惑的执行失败。

4 个答案:

答案 0 :(得分:5)

在那种测试中使用覆盖注释是完全有效的,但注释与测试完全没有特定的关系;它也可以(并且应该)在整个生产代码中使用。

答案 1 :(得分:2)

@Override的目的是声明你的意图覆盖一个方法,这样如果你犯了一个错误(例如错误的方法名拼写,错误的参数类型),编译器就会抱怨并且你很早就发现了你的错误。

所以这是完全有效的用途。

答案 2 :(得分:1)

使用-Xlint编译。它会抱怨在错误的地方丢失@ Override或@Overrides。

答案 3 :(得分:0)

@Override确保您实际上覆盖了该方法而不是意外地重载它,并且编译器警告可以帮助您确定是否覆盖了您想要重载的方法。

在这种情况下使用它是完全合法的,但鉴于它是一个测试,如果你重载方法而不是覆盖它(比如更改方法签名),测试应该会失败,所以也许它在这里不重要情况下。