Como alterar o design para que as entidades não usem injeções?

Eu li e percebi que entidades (objetos de dados - para JPA ou serialização) com injeções são uma má ideia. Aqui está o meu design atual (todos os campos apropriados têm getters e setter eserialVersionUID que deixo cair por brevidade).

Este é o objeto pai que é o cabeçalho do gráfico de composição da entidade. Este é o objeto que serializo.

public class State implements Serializable {

    List<AbstractCar> cars = new ArrayList<>();

    List<AbstractPlane> planes = new ArrayList<>();

   // other objects similar to AbstractPlane as shown below
}

AbstractPlane e suas subclasses são apenas classes simples, sem injeções:

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.

Por outro lado, cada tipo de carro concreto requer um gerente que tenha algum comportamento e também alguma forma específica de dados:

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.

oCarxManager estão@Stateless beans que executam operações nos dados (a correspondênciaCarxData) dado a eles. Eles mesmos usam injeções de muitos outros grãos e são todas subclasses deAbstractCarManager. Existem O (100) tipos de carros e gerentes correspondentes.

O problema ao serializar oState é que serializar a lista de carros abstratos não funciona bem com as injeções nas subclasses. Estou procurando um design que dissocie a injeção do processo de economia de dados.

Minhas perguntas relacionadas anteriores:Como serializar um feijão injetado? eComo posso dizer ao contêiner CDI para "ativar" um bean?

questionAnswers(4)

yourAnswerToTheQuestion