为了账号安全,请及时绑定邮箱和手机立即绑定

创建采用布尔值 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 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信