Есть ли «новый» модификатор для методов в Java? - PullRequest
2 голосов
/ 14 июля 2009

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

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

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

Ответы [ 3 ]

5 голосов
/ 14 июля 2009

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

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

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

protected void onBefore()  {

}

В подклассе

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

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

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

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

2 голосов
/ 14 июля 2009

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

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

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

1 голос
/ 14 июля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...