Возможно ли украсить 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
.
-Джонатан
Я уже пробовал шаблон композиции, но не рассматривает дублирование полей, это сделает класс Werewolf'ом неопределенным, в какое поле ему нужно получить + набор. См. Мое редактирование выше. Спасибо. –
Я чувствую, что нет необходимости реализовывать/расширять getter и seters, поскольку эти методы предназначены только для доступа к закрытым полям. Выполнение этого на самом деле тесно связано с вашим подклассом с вашими суперклассами. В большинстве случаев наилучшая практика заключается в том, чтобы просто распространять метафоры, представляющие поведение класса. И поскольку вы уже получаете доступ к атрибутам в Animal and Human в своем классе werewolf, вы можете просто определить некоторые методы, такие как getAnimalName и getHumanName, для доступа к этим дублируемым полям – tanghao