Есть ли "новый" модификатор для методов в 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()
метод.