2009-07-01 53 views
1

可能重复:
When do you use Java’s @Override annotation and why?何时使用@覆盖在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()签名的变化,我会得到我的测试编译错误,而不是一个令人困惑的执行失败。

+0

dupe,但现在找不到它... – jjnguy 2009-07-01 13:32:54

+0

发现它:http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why – AlbertoPL 2009-07-01 13:34:16

回答

5

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

1

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

0

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

在这种情况下使用它是完全合法的,但考虑到它是一个测试,如果您重载该方法而不是覆盖它(例如更改方法签名),则测试应该失败,因此可能不重要这个案例。

2

@Override的目的是,你声明你的意图是重写一个方法,这样如果你犯了一个错误(例如错误的方法名称拼写,错误的参数类型),编译器可能会抱怨,你会发现你的错误提前。

所以这是一个非常有效的用法。