Во-первых, уточнение: под «интерфейсом» я подразумеваю любую точку взаимодействия между компонентами, а не обязательно интерфейс «абстрактного типа».(Хотя, если я могу использовать такой интерфейс для этого, отлично.)
Я пишу класс, который предназначен для расширения.Проблемная область - глобальная оптимизация, поэтому любой программист конечного пользователя, который подклассирует мой класс (я буду называть их Стивом), будет предоставлять свою собственную проблему и алгоритм ее решения;Я просто предоставляю фреймворк (сеть, пользовательский интерфейс и т. Д.).Программа Стива может потребовать любое количество настроек конфигурации;Я хочу, чтобы мой код мог получать эти настройки от пользователя так же, как он получает свои собственные настройки (будь то из панели управления с графическим интерфейсом пользователя, файла конфигурации XML или чего-либо еще).Стиву не нужно дублировать какой-либо мой код, а также он не должен нарушать тип безопасности Java или модель инкапсуляции.
В идеале Стив мог бы написать что-то вроде этого:
public class SteveClass extends MyFrameworkClass {
@Configurable
private int foo;
@Configurable
private String bar;
private boolean baz;
// implementations of my abstract methods, etc.
}
Configurable
- это предоставленная мной аннотация, которая указывает, что аннотированная переменная является параметром конфигурации, который я должен получить от пользователя.Как вы можете видеть, я также хочу, чтобы Стив мог объявлять другие переменные экземпляра для своего собственного внутреннего использования, которых я никогда не трогал.
Я собирался реализовать это, включив в MyFrameworkClass
метод, который быпереберите getClass().getDeclaredFields()
и определите поля с аннотациями Configurable
.Затем он записывает пользовательский ввод в эти поля.Это не обязательно должно выглядеть точно так, с аннотациями и прочим, но вы поймете идею.
Проблема с этим, конечно, в том, что foo
и bar
являются частными и кодируются вMyFrameworkClass
не может написать им, даже задумчиво.Не помогло бы, если бы они были закрытыми для пакета, поскольку код Стива не будет в том же пакете, что и мой, и я бы предпочел, чтобы он не делал их общедоступными или добавлял какой-либо другой интерфейс, который позволял бы кому-либо, кромемне получить доступ к полям.
Есть ли способ сделать то, что я хочу, либо возиться с SecurityManager
, либо сделать что-то совершенно другое?