我已閱讀並感悟到自己,實體(數據對象 - 對於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將序列化類存儲爲字節數組,這是一個強烈的暗示,即您的整個解決方案正在吠叫錯誤的樹(在我看來)。 –