метод или некоторый интерфейс, который сделал бы то же самое, если вы не хотите, чтобы другие твердые методы были в нем). Однако этот ответ все еще как-то связан с ответом @Justin Cooke, и, по моему мнению, вы должны обязательно проверить те шаблоны, которые он упомянул в своем посте.
читал и осознал, что сущности (объекты данных - для JPA или сериализации) с инъекциями в них - плохая идея. Вот мой текущий дизайн (все соответствующие поля имеют геттеры и сеттеры, иserialVersionUID
который я опускаю для краткости).
Это родительский объект, который является главой графа композиции сущностей. Это объект, который я сериализую.
public class State implements Serializable {
List<AbstractCar> cars = new ArrayList<>();
List<AbstractPlane> planes = new ArrayList<>();
// other objects similar to AbstractPlane as shown below
}
AbstractPlane
и его подклассы - просто простые классы без инъекций:
public abstract class AbstractPlane implements Serializable {
long serialNumber;
}
public class PropellorPlane extends AbstractPlane {
int propellors;
}
public class EnginePlane extends AbstractPlane {
List<Engine> engines = new ArrayList<>(); // Engine is another pojo
}
// etc.
Напротив, каждый конкретный тип автомобиля требует менеджера, который имеет некоторое поведение, а также некоторую конкретную форму данных:
public abstract class AbstractCar implements Serializable {
long serialNumber;
abstract CarData getData();
abstract void operate(int condition);
abstract class CarData {
String type;
int year;
}
}
public class Car1 extends AbstractCar {
@Inject
Car1Manager manager;
Car1Data data = new Car1Data(); // (getter exists per superclass requirement)
void operate(int i) { // logic looks weird but makes the example
if (i < 0)
return manager.operate(data);
else if (i > 1)
return manager.operate(data, i);
}
class Car1Data extends CarData {
int property1;
{
type = "car1";
year = 1;
}
}
}
public class Car2 extends AbstractCar {
@Inject
Car2Manager manager;
Car2Data data = new Car2Data();
void operate(int i) {
if (i < 31)
return manager.operate(data);
}
class Car2Data extends CarData {
char property2;
{
type = "car2";
year = 12;
}
}
}
// etc.
CarxManager
находятся@Stateless
бины, которые выполняют операции с данными (соответствующиеCarxData
дается им. Они сами в дальнейшем используют инъекции многих других бобов, и все они являются подклассамиAbstractCarManager
, Есть O (100) типов автомобилей и соответствующих менеджеров.
Проблема при сериализацииState
заключается в том, что сериализация списка абстрактных автомобилей плохо сочетается с инъекциями в подклассы. Я ищу дизайн, который отделяет инъекцию от процесса сохранения данных.
Мои предыдущие связанные вопросы:Как сериализовать введенный боб? а такжеКак я могу сказать контейнеру CDI «активировать» бин?