AspectJ.Создание методов типа innter в нескольких классах - PullRequest
3 голосов
/ 17 сентября 2010

Если я поставлю:

public CountryState CountryState.find(long id) {
        return (CountryState) findById(CountryState.class, id);
}

Я создаю метод find в классе CountryState.

Есть ли способ создать метод в нескольких классах? Нужно ли повторять код для каждого класса, который я хочу создать?

Я знаю, что с аспектом я могу сделать класс наследуемым от другого, но, делая это, я могу создать один суперкласс, потому что Java не принимает множественное наследование.

Ответы [ 2 ]

5 голосов
/ 22 сентября 2010

Этот 'шаблон' - это то, как вы делаете это в AspectJ.

Объявление интерфейса:

interface Holder {}

Создайте объявления intertype на интерфейсе:

public int Holder.getMeAnInt() {
  return 42;
}

Когда вы делаете такое объявление в интерфейсе, вы предоставляете «реализацию по умолчанию».Таким образом, интерфейс теперь будет определять getMeAnInt (), и любые реализации Holder, которые не реализуют getMeAnInt (), получат реализацию по умолчанию.

В последнем фрагменте головоломки нужно использовать объявление родителей, чтобы указать группутипы реализуют ваш интерфейс:

declare parents: @Anno * implements Holder;

Теперь любой тип, аннотированный @Anno, будет реализовывать Holder и иметь метод getMeAnInt ().

0 голосов
/ 18 сентября 2010

Вы действительно можете решить это без использования АОП.Вы можете просто использовать OOP / OOD.Есть два способа (я предполагаю, что вы хотите написать метод один раз):

  1. Создать абстрактный базовый класс с реализацией метода и извлечь из него все классы.На самом деле это не лучшая идея.

  2. Создание вспомогательного класса, который будет реализовывать ваш метод find () и делиться им между классами (либо с помощью Dependency Injection, либо просто связывая их).

Так что, если я правильно понимаю, на самом деле вам нужен универсальный метод, который будет возвращать экземпляры целевого класса:

public <T> find(long id, T targetClassObject) {
  Class<? extends T> class = targetClassObject.getClass();
  // do something i.e. call target method via reflection
}
...