3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
我可以給你一些你可以嘗試的提示,盡管可能有一些警告:
創(chuàng)建一個(gè)單獨(dú)的工廠類(lèi)而不是基類(lèi)。
在工廠類(lèi)中將構(gòu)造函數(shù)設(shè)為私有
在工廠類(lèi)中實(shí)例化一個(gè)虛擬私有對(duì)象
讓
MinorEmployee
andAdultEmployee
的唯一構(gòu)造函數(shù)接受工廠類(lèi)的對(duì)象。由于私有構(gòu)造函數(shù),工廠對(duì)象不能存在于類(lèi)之外,實(shí)際上沒(méi)有其他人應(yīng)該能夠從外部實(shí)例化這些類(lèi)。使用虛擬對(duì)象在您的工廠方法中傳遞。

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊
另一種方法是:
您可以將構(gòu)造函數(shù)設(shè)為私有并使用輔助方法來(lái)識(shí)別新實(shí)體的請(qǐng)求來(lái)自何處。如果來(lái)自您想要的地方,則返回對(duì)象的新實(shí)例,否則您可以拋出異常。

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊
MinorEmployee您可以在和AdultEmployeeas中聲明構(gòu)造函數(shù),private然后在您的工廠方法中使用反射:
public static Employee create(LocalTime birthdate) {
try {
Class<? extends Employee> clazz;
if (omitted) {
clazz = MinorEmployee.class;
} else {
clazz = AdultEmployee.class;
}
Constructor<? extends Employee> cons = clazz.getConstructor();
cons.setAccessible(true);
return cons.newInstance();
} catch (NoSuchMethodException | SecurityException
| InstantiationException | IllegalAccessException
| InvocationTargetException ex) {
// handle the exception
}
}
添加回答
舉報(bào)