有没有“新的”? Java 中方法的修饰符?

发布于 2024-07-26 18:12:42 字数 387 浏览 2 评论 0原文

是否有相当于 C# 的 new Java 中的 修饰符?

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

我不想为每个 init() 方法想出新名称,而且我绝对想将它们标记为 Final 以确保它们不会互相覆盖(另一种模式是覆盖并调用 super.init() 方法)。每个 init() 方法中的 init() )。

Is there an equivalent to C#'s new modifier in Java?

I'd like to use it for unit tests - every init() method should be marked final and annotated with @Before. Then, jUnit executes all of these init() methods.

I don't want to bother coming up with new names for each of these init() methods, and I definitely wants to mark them as final to make sure they don't override eachother (an alternative pattern is to override and call super.init() from every init() method).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

耳根太软 2024-08-02 18:12:42

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

在超类中

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

protected void onBefore()  {

}

在子类中

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

这为您提供了两全其美的方法:

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

它确实有一个缺点——它将你与一个超类联系在一起。 不过,这对您的环境来说可能不是问题。

A common pattern is to make your own 'before' methods final and create protected (abstract) methods for the subclasses.

In the superclass

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

protected void onBefore()  {

}

In the subclass

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

This gives you the best of both worlds:

  • a well-known method to override in sub-classes;
  • overriding is optional;
  • the superclass method is never overriden;
  • the client method is invoked when the super-class decides, i.e. either before or after the super-class decides.

It does have a single downside - it ties you to a single super-class. Still, that may not be an issue to your environment.

空气里的味道 2024-08-02 18:12:42

不幸的是没有。 哎呀,在 @Override 之前,甚至没有任何方法可以防止覆盖时出现拼写错误。

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

您是否考虑过对类 FooBar< 使用 initFooinitBar /code> 分别(等等)? 这是一个足够简单的模式,可以遵循,并且可以避免名称冲突。 不可否认,有点丑。

Unfortunately not. Heck, before @Override there wasn't even any way of protecting against typos when overriding.

You can't create a method with the same signature as a superclass method without it overriding that method. Admittedly I try not to do this even in C#...

Have you considered using initFoo and initBar for classes Foo and Bar respectively (etc)? It's a simple enough pattern to follow, and would avoid the name collisions. A bit ugly, admittedly.

ぽ尐不点ル 2024-08-02 18:12:42

Java 没有相当于 C# new 运算符,它是

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

对于您想做的事情,为什么不创建一个其他测试可以扩展的基类,并创建一个名为 init()abstract 方法(用 标记) >@Before) 在基类中? 这会强制所有子类提供 init() 方法。

Java does not have an equivalent to the C# new operator which is

Used to hide an inherited member from a base class member.

For what you'd like to do, why not create a base class that your other tests can extend, and create an abstract method named init() (marked with @Before) in the base class? This forces all subclasses to supply an init() method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文