Есть ли "новый" модификатор для методов в Java?

Есть ли эквивалент C#new модификатор в Java?

Я хотел бы использовать его для модульных тестов - каждый метод init () должен быть помечен как финальный и помечен @Before. Затем jUnit выполняет все эти методы init ().

Я не хочу придумывать новые имена для каждого из этих методов init (), и я определенно хочу пометить их как окончательные, чтобы убедиться, что они не переопределяют друг друга (альтернативный шаблон - переопределить и вызвать super.init() из каждого метода init ().

3 ответа

Обычный шаблон - сделать ваши собственные методы before перед финальными и создать защищенные (абстрактные) методы для подклассов.

В суперклассе

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

protected void onBefore()  {

}

В подклассе

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

Это дает вам лучшее из обоих миров:

  • хорошо известный метод для переопределения в подклассах;
  • переопределение необязательно;
  • метод суперкласса никогда не переопределяется;
  • метод client вызывается, когда принимает решение суперкласс, т.е. либо до, либо после принятия решения суперклассом.

У него есть один недостаток - он связывает вас с одним суперклассом. Тем не менее, это не может быть проблемой для вашей среды.

К сожалению нет. Черт, до того @Override не было никакого способа защиты от опечаток при переопределении.

Вы не можете создать метод с такой же сигнатурой, как у метода суперкласса, без переопределения этого метода. Правда, я стараюсь не делать этого даже в C#...

Рассматривали ли вы использование initFoo а также initBar для занятий Foo а также Bar соответственно (и тд)? Это достаточно простой шаблон для подражания, позволяющий избежать конфликтов имен. Немного некрасиво, по общему признанию.

Java не имеет эквивалента C# new оператор, который

Используется, чтобы скрыть унаследованный член от члена базового класса.

Для того, что вы хотите сделать, почему бы не создать базовый класс, который могут расширяться вашими другими тестами, и создать abstract названный метод init() (отмечено @Beforeв базовом классе? Это заставляет все подклассы предоставлять init() метод.

Другие вопросы по тегам