我已阅读并感悟到自己,实体(数据对象 - 对于JPA或序列号)在他们注射是一个坏主意。这是我目前的设计(所有适当的领域都有getter和setter方法,以及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
beans对数据执行操作(匹配CarxData
)给予他们。他们自己进一步使用其他许多豆类的注射剂,它们都是AbstractCarManager
的子类。有O(100)种车型和配套管理人员。
序列化State
时的问题是,序列化抽象汽车的名单不与子类打针打得很好。我正在寻找一种能够将注入从数据保存过程中分离出来的设计。
我以前的相关问题:How to serialize an injected bean?和How can I tell the CDI container to "activate" a bean?
管理员网络由CDI或EJB构建,是吗?如果每种车型都有匹配的经理,为什么不让经理进行序列化呢?如果经理级别比汽车级别少,汽车级别以外的任何人都必须知道如何将经理与汽车连接起来,这是一种工厂,应该在连载过程中调用工厂并将经理放入汽车。如果汽车是相互连接的对象,管理儿童或邻居,而不是管理者,访问者应该处理创建,而另一位访问者应该处理操作功能 – aschoerk
@aschoerk它如何提供帮助? 1.汽车豆仍然需要序列化,并包括注入。 2.管理者不知道实体树,他们的目的是操纵数据。 3.我正在序列化“国家” - 管理人员如何参与其中?每辆汽车有一位经理,汽车不相关。 – Mark
听起来像你已经意识到你原来的问题是[XY问题]的例子(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),但在很大程度上这一个也是。你仍然关注依赖注入问题,而不是看你想解决的更大问题。在类名中使用诸如“Manager”和“Data”之类的词,并使用JPA将序列化类存储为字节数组,这是一个强烈的暗示,即您的整个解决方案正在吠叫错误的树(在我看来)。 –