Я работаю над инструментом, где пользователи могут использовать свои собственные аннотации для описания рабочего процесса обработки данных (например, проверка, преобразование и т. Д.).
Помимо использования готовых к использованию аннотаций, пользователи могут создавать свои собственные: для этого им нужно объявить сам класс аннотаций, а затем реализовать процессор аннотаций (<- это главный вопрос этого вопроса). </p>
Сконфигурированный метод для обработки данных может выглядеть следующим образом:
void foo(@Provide("dataId") @Validate(Validator.class) String str) {
doSmth(str);
}
Естественно, есть три группы аннотаций:
- те, которые производят начальные значения;
- те, которые преобразуют значения (преобразователи);
- те, которые просто читают значения и выполняют некоторую работу (валидаторы, разные потребители).
Поэтому мне нужно сделать выбор: либо создать один интерфейс для обработки всех этих типов аннотаций, которыйможет выглядеть так:
interface GenericAnnotationProcessor {
Object processAnnotation(Annotation annotation, Object processedValue);
}
Или я могу добавить 3 интерфейса к API:
interface ProducerAnnotationProcessor {
Object produceInitValue(Annotation annotation);
}
interface TransformerAnnotationProcessor {
Object transformValue(Annotation annotation, Object currentValue);
}
interface ConsumerAnnotationProcessor {
void consumeValue(Annotation annotation, Object currentValue);
}
Первый вариант не очень понятен для васДа, но третий вариант загрязняет API тремя почти схожими интерфейсами.
Что бы вы выбрали (прежде всего, как пользователь API) и почему?
Спасибо!