亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

創建采用布爾值 isX 并根據該值需要 isY 的布爾值的構造函數的最佳實踐是什么?

創建采用布爾值 isX 并根據該值需要 isY 的布爾值的構造函數的最佳實踐是什么?

夢里花落0921 2022-12-21 10:15:12
在這個假設的問題中,我正在創建一個類來表示香腸,它可以是:A. 新鮮和包裝 B. 新鮮但未包裝 C. 不新鮮且未包裝注意:它不能是不新鮮和包裝好的??紤]到這一點,我正在尋找創建構造函數的最佳實踐。我嘗試的方法如下,但我認為應該有更好的解決方案。public class Sausage {    Meat meat;    boolean isFresh;    boolean isPackaged;    public Sausage(Meat meat, Boolean isFresh, Boolean isPackaged) {        this.meat = meat;        if (!isFresh) {            this.isFresh = false;            this.isPackaged = false;        }        else if (isPackaged) {            this.isFresh = true;            this.isPackaged = true;        }        else {            this.isFresh = true;            this.isPackaged = false;        }    }}我正在尋找一種更簡潔的方式來提供此功能。
查看完整描述

3 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

您可以將可能的狀態表示為枚舉類型:


enum SausageType {

    FreshPackaged,

    FreshUnpackaged,

    NotFresh;

}

然后更改您的構造函數以使用 aSausageType而不是 two Booleans。


這種方法的優點是不可能用錯誤的狀態組合調用構造函數,對于你的類的用戶來說很明顯可能的值是什么,你不需要記住保持參數的脆弱的運行時檢查與不斷變化的要求保持同步。


查看完整回答
反對 回復 2022-12-21
?
DIEA

TA貢獻1820條經驗 獲得超2個贊

您當前的方法幾乎沒有問題:

  1. 有一種方法可以創建new沒有意義的寫入對象,例如new Sausage(..., false, true)packaged 將被靜默轉換為false. 這很混亂,使代碼更難理解。

  2. 您正在混合Boolean對象類型和boolean原始類型,這將導致不必要的自動裝箱。如果您不需要支持null使用boolean.

  3. boolean字段可能不需要is前綴。

由于有兩個布爾標志和 4 種可能性,它們可以被設置(true truetrue falsefalse truefalse 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;

    }

}


查看完整回答
反對 回復 2022-12-21
?
精慕HU

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任何意義。


查看完整回答
反對 回復 2022-12-21
  • 3 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號