Могу ли я "переопределить" аннотации частного поля суперкласса? - PullRequest
0 голосов
/ 10 декабря 2018

20 лет на других языках программирования, и теперь я новичок в Java, чувствую себя программистом-новичком ...

Я использую Indexable абстрактный класс для расширения всех своих@entity классов, поэтому мне не нужно ставить @Id @GeneratedValue @SequenceGenerator на все из них.И у меня также есть Auditable с @CreatedBy @CreatedDate @ModifiedBy @ModifiedDate, который ведет к следующему пути наследования:

  • MostEntityClasses> AuditableClass> IndexableClass;
  • SomeEntityClasses> IndexableClass.

Теперь я заметил, что 99% моих классов сущностей также имеют:

@Column(nullable = false, unique = true) private String name;

Я думал о переносе этой строки в класс Indexable, чтобы избежать этого стандартного кода в этих 99%, но два классакоторые не имеют поля name , являются важными аудируемыми классами, и я не хочу просто копировать в них все поля-предки, чтобы избежать ошибок с нулевыми именами.

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

class SomeAuditableClass extends Audited {
  //@override
  @Column(nullable = true) @Transient private String name;

Содержимое в Есть ли способ переопределить переменные класса в Java? мало помогло ...

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Нет, вы не можете их переопределить:

  • На уровне языка Java нет механизмов переопределения аннотаций для полей.
  • Закрытые поля родительского класса недоступны в дочернем классе , чтобы не мог дочерний класс нарушить / помешать абстракции.

Во время выполнения вы могли быпотенциально нарушить абстракцию, используя отражение, чтобы увидеть аннотации частных полей суперклассов.Но вы не можете добавлять или удалять их: см. Добавление аннотаций Java во время выполнения .И даже если бы вы могли, время выполнения может быть слишком поздним.

Единственный способ получить некоторую тягу здесь - это определить код, который обрабатывает аннотации, и изменить его для (каким-то образом!) Принятия переопределений.из какого-то (не Java) файла.

Но для вашего случая использования это кажется очень плохой идеей.Вы не хотите создавать и поддерживать частную ветвь (скажем) Hibernate с нестандартной функциональностью просто для того, чтобы сэкономить вам сравнительно небольшое количество стандартного кода.

0 голосов
/ 10 декабря 2018

Хотя это и не ответ на ваш точный вопрос, типичным способом решения этой проблемы было бы расширение Indexable другим классом, скажем, IndexableWithName.Тогда 99% ваших сущностей, которые имеют поле name, будут расширяться IndexableWithName, в то время как два класса, у которых нет поля name, будут напрямую расширяться Indexable.

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

...