Возможно ли в Java создать аннотацию для интерфейса, принудительно внедряя классы в определенный список параметров для конструктора

#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. После довольно продолжительных исследований я обнаружил, что ваш метод наиболее близок к моей желаемой ситуации.