метод или некоторый интерфейс, который сделал бы то же самое, если вы не хотите, чтобы другие твердые методы были в нем). Однако этот ответ все еще как-то связан с ответом @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 «активировать» бин?

Ответы на вопрос(4)

Ваш ответ на вопрос