У меня есть особая ситуация, когда я хотел бы создать аннотацию, которая может принимать "базовую" аннотацию в качестве одного из своих параметров:
public @interface Fleet
{
int fleetSize();
Vehicle fleetType();
}
Где @Vehicle
- это "базовая" аннотация дляразличные типы транспортных средств, которые будут принимать различные параметры, которые имеют смысл для них:
public @interface Vehicle {}
public @interface Car extends Vehicle {
boolean is2WheelDrive();
}
public @interface Motorcycle extends Vehicle {
String manufacturer();
}
Так, чтобы аннотация @Fleet
могла использоваться следующим образом:
// A fleet of 20 Hyabusas
@Fleet(20, @Motorcycle("Hyabusas"))
public void doSomething() {
// ...
}
// A fleet of 5 4-Wheel-drive cars
@Fleet(5, @Car(false))
public void doSomethingElse() {
// ...
}
Теперь, во-первыхНесколько вещей: да, я знаю, этот пример иллюстрирует ужасный дизайн!И я знаю, что вы не можете расширять аннотации с помощью Java.
Учитывая эти два известных зла, как я мог бы в любом случае реорганизовать эти фрагменты кода так, чтобы были соблюдены следующие ограничения:
- Аннотации
@Fleet
можно передавать либо @Car
, либо @Motorcycle
@Car
и @Motorcycle
принимать разные (как по количеству, так и по типу) аргументы
Заранее спасибо!