Java中的方法是否有'new'修饰符?

时间:2009-07-14 13:09:10

标签: java inheritance junit

Java中是否有等效的C#'s new修饰符?

我想将它用于单元测试 - 每个init()方法都应标记为final并使用@Before进行注释。然后,jUnit执行所有这些init()方法。

我不想打扰每个init()方法的新名称,我肯定想把它们标记为final,以确保它们不会覆盖彼此(另一种模式是覆盖和从每个init()方法调用super.init()。

3 个答案:

答案 0 :(得分:5)

一种常见的模式是使自己的'before'方法最终成为最终,并为子类创建受保护(抽象)方法。

在超类

@Before
public final void before() {
   onBefore();
}

protected void onBefore()  {

}

在子类

protected void onBefore() {
    // prepare the test fixture
}

这为您提供了两全其美的优势:

  • 在子类中重写的众所周知的方法;
  • 覆盖是可选的;
  • 超类方法永远不会被覆盖;
  • 当超级类在超类决定之前或之后决定时调用客户端方法。

它确实有一个缺点 - 它将你绑定到一个超级班级。不过,这对您的环境来说可能不是问题。

答案 1 :(得分:2)

不幸的是没有。哎呀,在@Override之前,在覆盖时甚至没有任何防止错别字的方法。

如果没有覆盖该方法,则无法创建与超类方法具有相同签名的方法。诚然,即使在C#中,我也尽量不这样做......

您是否考虑过将initFooinitBar分别用于FooBar类(等)?这是一个足够简单的模式,可以避免名称冲突。不可否认,有点难看。

答案 2 :(得分:1)

Java没有等效于

的C#new运算符
  

用于从基类成员隐藏继承的成员。

对于您想要做的事情,为什么不创建其他测试可以扩展的基类,并创建名为abstract的{​​{1}}方法(标有init())in基类?这会强制所有子类提供@Before方法。