#java #interface #constructor #annotations
#java #интерфейс #конструктор #аннотации
Вопрос:
Я ищу способ в Java заставить классы, которые реализуют определенный интерфейс, определять определенный конструктор.
Пример:
@Constructor(X, Y, Z)
public interface A {}
public class B implements A {
public B(X x, Y y, Z z) {}
}
В этом случае это заставило бы реализующий класс содержать конструктор с этим списком параметров. Есть ли какой-нибудь способ сделать это на самом деле?
PS Я понимаю, что это противоречит практике проектирования интерфейсов, это просто то, что в моем случае требуется реализующим классам из-за определенной реализации фабричного метода, не связанной с компилятором.
Комментарии:
1. Почему бы не использовать для этого абстрактный класс?
2. Это даже невозможно с абстрактными базовыми классами.
3. @Thilo ну, в away это так. Либо реализующий класс должен определить тот же параметр конструктора, либо вызвать super с тем же аргументом конструктора.
4. Речь идет не о вызове определенного конструктора, а об определении конструктора, отвечающего требованиям, которые я хотел бы видеть возможным структурно объявить в коде.
5. Хорошо, разверните плагин maven со сканированием пути к классам для реализующих классов и быстро завершите работу, если реализующий класс не является абстрактным и не определяет требования к конструктору.
Ответ №1:
Почему бы не использовать для этого абстрактный класс? В противном случае вам придется развернуть процессор аннотаций и сканирование пути к классам, чтобы проверить, что все реализующие классы подчиняются аннотации. Если вы решите пойти по этому пути, плагин maven также может помочь на этапе компиляции и просканировать путь к классу, чтобы убедиться, что реализующие классы определили конструктор
Комментарии:
1. Вы не можете заставить дочерний класс иметь определенный конструктор, только методы.
2. После довольно продолжительных исследований я обнаружил, что ваш метод наиболее близок к моей желаемой ситуации.