Абстракция аннотаций Java - PullRequest
3 голосов
/ 14 января 2012

У меня есть особая ситуация, когда я хотел бы создать аннотацию, которая может принимать "базовую" аннотацию в качестве одного из своих параметров:

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 принимать разные (как по количеству, так и по типу) аргументы

Заранее спасибо!

1 Ответ

1 голос
/ 14 января 2012

Я не думаю, что вы действительно можете это сделать.

Обычный подход - применить к классу @Fleet и один из @Car и @Motorcycle. Не идеал, по общему признанию.

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