3 回答

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

TA貢獻1820條經驗 獲得超2個贊
您當前的方法幾乎沒有問題:
有一種方法可以創建
new
沒有意義的寫入對象,例如new Sausage(..., false, true)
packaged 將被靜默轉換為false
. 這很混亂,使代碼更難理解。您正在混合
Boolean
對象類型和boolean
原始類型,這將導致不必要的自動裝箱。如果您不需要支持null
使用boolean
.boolean
字段可能不需要is
前綴。
由于有兩個布爾標志和 4 種可能性,它們可以被設置(true true
, true false
, false true
, false false
)但只有 3 個有效選項可能命名為工廠方法會更合適:
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貢獻1845條經驗 獲得超8個贊
悄悄改成isPackaged可能false是調用代碼的驚喜。在這里,如果選擇了組合(非新鮮、包裝),您可以選擇拋出異常。
if (!isFresh && isPackaged) {
throw new IllegalArgumentException("Can't be both not fresh and packaged!");
}
this.isFresh = isFresh;
this.isPackaged = isPackaged;
您還可以決定使用private強制執行您的要求的工廠方法(制作您的構造函數)。這將避免需要拋出異常。
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將用于構造函數的參數類型,而不是 object wrapper Boolean,就像您的實例變量一樣。null此處允許的值沒有Boolean任何意義。
添加回答
舉報