2014-02-01 1 views
0

Возможно ли украсить POJO полями и геттерами + сеттеры с аннотациями? Скажем, у меня есть класс, как отредактирован:Использование аннотаций (с AOP?) Для ввода полей (с геттерами и сеттерами) в POJO

public abstract class Human { //to be extended by classes like Male, Female 
    private String name; 
    private String identificationNumber; 
    private String mailingAddress; 

    public void setName(String name) {...} 
    public String getName() {...} 

    public void setIdentificationNumber(String number) {...} 
    public String getIdentificationNumber() {...} 

    public void setMailingAddress(String address) {...} 
    public String getMailingAddress() {...} 
} 

и у меня есть еще один класс, как отредактирован:

public abstract class Animal { //to be extended by classes like Dog, or Wolf 
    private String name; 
    private String furColor; 
    private String ferocityIndex; 

    public void setName(String name) {...} 
    public String getName() {...} 

    public void setFurColor(String color) {...} 
    public String getFurColor() {...} 

    public void setFerocityIndex(String index) {...} 
    public String getFerocityIndex() {...} 
} 

Если есть сценарий, где мне нужно создать оборотень (гибрид Человек и животное), по существу мне нужно «расширить» оба класса. Я уже понимаю, что я мог использовать интерфейсы для обоих абстрактных классов, но это означало бы повторное внедрение геттеров и сеттеров и реализацию реализации на весь класс реализации.

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

@Human 
@Animal 
public class Werewolf { 
} 

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

public static void main(String[] args) { 
    Werewolf jonathan = new Werewolf(); 
    jonathan.getName(); 
    //should be Werewolf's not Human's implementation or Animal implementations 
    //if jonathan has a different animal name, @Animal should implement animalName, not name 
    jonathan.getFerocityIndex(); //should be here 
    jonathan.getIdentificationNumber(); //should also be here 
} 

Мой проект в настоящее время использует весной, так что Spring AOP не может быть и речи до тех пор, как кто-то может мне точку в правильном направлении, если это вообще возможно, или уже есть библиотека для этого. Поскольку я думаю с определенной точки зрения, у оборотня есть человеческий аспект и аспект Животных, CMIIW.

Вкратце: есть ли в любом случае для меня встраивание в поле компиляции набора полей с помощью геттер + сеттеров (определяемых аннотацией?), В аннотированный класс?

отредактированный для дополнительной детализации:

  • Оба @Animal и @Human определяет поле name. Который при введении в Werewolf должен стать его (это?) name.
  • Ответ от user2693476 содержит состав IHuman и IAnimal сделает поле name непоследовательным, это человеческое или животное?
  • Моя цель состоит в @Human и @Animal сказать аннотированный Werewolf класс, который: Я даю вам эти поля в качестве собственного. Итак, в некотором смысле: код шаблонов. Используя отражение, я мог бы обнаружить дублированные поля name и применить только один раз или бросить RuntimeException. Но я еще не знаю, как вводить коды в класс Werewolf.

-Джонатан

ответ

0

Цель для Spring АОПА вводить некоторые общие коды, которые повторяются во многих методах, так что вам нужно только определить эти общие коды в методе, и вы можете использовать его везде в вашей программе, и это не подходит для применения в вашей проблеме. В вашем случае, это больше похоже на дизайн OO проблемы, так как ваш оборотень нужно разделить оба свойства человека и животных, можно определить еще два интерфейса для человека и животных:

public interface IHuman{ //implemented by Human and Werewolf 
    public void setIdentificationNumber(String number); 
    public String getIdentificationNumber(); 
    public void setMailingAddress(String address); 
    public String getMailingAddress(); 
} 

public interface IAnimal { //implemented by Animal and Werewolf 
    public void setFurColor(String color); 
    public String getFurColor() {...} 

    public void setFerocityIndex(String index); 
    public String getFerocityIndex(); 
} 

и в классе Werewolf , вы можете использовать преимущества композиции, чтобы помочь вам реализовать свою идею.

public class Werewolf implements IHuman, IAnimal{ 
    private IHuman human; 
    private IAnimal animal; 

    //create getter and setter for human and animal to assign the concrete implemented Human and Animal instance to Werewolf 
    ... 
    //and you can define all your unimplemented methods in this way 
    public void setIdentificationNumber(String number){ 
     this.human.setIdentificationNumber(number); 
    } 

    public String getIdentificationNumber(){ 
     return this.human.getIdentificationNumber(); 
    } 

    public void setMailingAddress(String address){ 
     this.human.setMailingAddress(address); 
    } 

    public String getMailingAddress(){ 
     return this.human.getMailingAddress(); 
    } 

    public void setFurColor(String color){ 
     this.animal.setFurColor(color); 
    } 
    public String getFurColor() { 
     return this.animal.getFurColor(); 
    } 

    public void setFerocityIndex(String index){ 
    this.animal.setFerocityIndex(index); 
    } 
    public String getFerocityIndex(){ 
    return this.animal.getFerocityIndex(); 
    } 

} 
+0

Я уже пробовал шаблон композиции, но не рассматривает дублирование полей, это сделает класс Werewolf'ом неопределенным, в какое поле ему нужно получить + набор. См. Мое редактирование выше. Спасибо. –

+0

Я чувствую, что нет необходимости реализовывать/расширять getter и seters, поскольку эти методы предназначены только для доступа к закрытым полям. Выполнение этого на самом деле тесно связано с вашим подклассом с вашими суперклассами. В большинстве случаев наилучшая практика заключается в том, чтобы просто распространять метафоры, представляющие поведение класса. И поскольку вы уже получаете доступ к атрибутам в Animal and Human в своем классе werewolf, вы можете просто определить некоторые методы, такие как getAnimalName и getHumanName, для доступа к этим дублируемым полям – tanghao

0

Вы, кажется, ищете обходное решение для множественного наследования в Java, используя аннотации. Проверьте аннотацию @Delegate проекта Lombock. Если вам это не нравится, вы должны взглянуть на инструмент обработки аннотаций для Java и написать свои собственные аннотации. Остерегайтесь возможных недостатков таких решений (поддержка IDE, документация, читаемость для новых участников ...).

Смежные вопросы