3 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
您可以將可能的狀態(tài)表示為枚舉類型:
enum SausageType {
FreshPackaged,
FreshUnpackaged,
NotFresh;
}
然后更改您的構(gòu)造函數(shù)以使用 aSausageType而不是 two Booleans。
這種方法的優(yōu)點(diǎn)是不可能用錯誤的狀態(tài)組合調(diào)用構(gòu)造函數(shù),對于你的類的用戶來說很明顯可能的值是什么,你不需要記住保持參數(shù)的脆弱的運(yùn)行時(shí)檢查與不斷變化的要求保持同步。

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊
您當(dāng)前的方法幾乎沒有問題:
有一種方法可以創(chuàng)建
new
沒有意義的寫入對象,例如new Sausage(..., false, true)
packaged 將被靜默轉(zhuǎn)換為false
. 這很混亂,使代碼更難理解。您正在混合
Boolean
對象類型和boolean
原始類型,這將導(dǎo)致不必要的自動裝箱。如果您不需要支持null
使用boolean
.boolean
字段可能不需要is
前綴。
由于有兩個(gè)布爾標(biāo)志和 4 種可能性,它們可以被設(shè)置(true true
, true false
, false true
, false false
)但只有 3 個(gè)有效選項(xiàng)可能命名為工廠方法會更合適:
public class Sausage {
public static Sasuage newFreshPackaged(Meat meat) {
return new Sasuage(meat, true, true);
}
public static Sasuage newFreshNotPackaged(Meat meat) {
return new Sasuage(meat, true, false);
}
public static Sasuage newNotFreshNotPackaged(Meat meat) {
return new Sasuage(meat, false, false);
}
private Sausage(Meat meat, boolean fresh, boolean packaged) {
this.meat = meat;
this.fresh = fresh;
this.packaged = packaged;
}
}

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
悄悄改成isPackaged可能false是調(diào)用代碼的驚喜。在這里,如果選擇了組合(非新鮮、包裝),您可以選擇拋出異常。
if (!isFresh && isPackaged) {
throw new IllegalArgumentException("Can't be both not fresh and packaged!");
}
this.isFresh = isFresh;
this.isPackaged = isPackaged;
您還可以決定使用private強(qiáng)制執(zhí)行您的要求的工廠方法(制作您的構(gòu)造函數(shù))。這將避免需要拋出異常。
public static Sausage createFreshSausage(Meat meat, boolean isPackaged) {
return new Sausage(meat, true, isPackaged);
}
public static Sausage createNotFreshSausage(Meat meat) {
return new Sausage(meat, false, false);
}
順便說一句,通常原語boolean將用于構(gòu)造函數(shù)的參數(shù)類型,而不是 object wrapper Boolean,就像您的實(shí)例變量一樣。null此處允許的值沒有Boolean任何意義。
添加回答
舉報(bào)