В настоящее время я разрабатываю API, в котором я хочу разрешить настройку различными способами. Один метод - через схему конфигурации XML, а другой - через API, с которым я бы хотел хорошо поиграть в Spring.
Мой код синтаксического анализа XML-схемы ранее был скрыт, и поэтому единственное беспокойство касалось его работы, но теперь я хочу создать общедоступный API, и я весьма обеспокоен передовой практикой.
Кажется, что многие предпочитают javabean-тип PoJo с конструкторами по умолчанию с нулевым параметром, а затем с установкой. Проблема, которую я пытаюсь решить, состоит в том, что некоторые реализации методов установки зависят от других методов установки, вызываемых перед ними последовательно.
Я мог бы написать анальные сеттеры, которые допустят, чтобы их вызывали во многих порядках, но это не решит проблему, когда пользователь забыл установить соответствующий сеттер и, следовательно, бин находился в неполном состоянии.
Единственное решение, которое я могу придумать, - это забыть о
'beans' и применить необходимые параметры с помощью инжектора конструктора.
Примером этого является установка идентификатора компонента по умолчанию на основе идентификатора родительских компонентов.
Мой интерфейс
public interface IMyIdentityInterface {
public String getId();
/* A null value should create a unique meaningful default */
public void setId(String id);
public IMyIdentityInterface getParent();
public void setParent(IMyIdentityInterface parent);
}
Базовая реализация интерфейса:
public abstract class MyIdentityBaseClass implements IMyIdentityInterface {
private String _id;
private IMyIdentityInterface _parent;
public MyIdentityBaseClass () {}
@Override
public String getId() {
return _id;
}
/**
* If the id is null, then use the id of the parent component
* appended with a lower-cased simple name of the current impl
* class along with a counter suffix to enforce uniqueness
*/
@Override
public void setId(String id) {
if (id == null) {
IMyIdentityInterface parent = getParent();
if (parent == null) {
// this may be the top level component or it may be that
// the user called setId() before setParent(..)
} else {
_id = Helpers.makeIdFromParent(parent,getClass());
}
} else {
_id = id;
}
}
@Override
public IMyIdentityInterface getParent() {
return _parent;
}
@Override
public void setParent(IMyIdentityInterface parent) {
_parent = parent;
}
}
У каждого компонента в платформе будет родитель, кроме компонента верхнего уровня. При использовании метода ввода метода установки метод настройки будет отличаться в зависимости от порядка вызова метода установки.
В этом случае, согласитесь ли вы, что конструктор, принимающий ссылку на родителя, лучше и полностью удаляющий метод родительского сеттера из интерфейса? Считается ли это плохой практикой, если я хочу настроить эти компоненты с помощью контейнера IoC?
Chris