首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于创建一个接受布尔值isX的构造函数,并根据该值需要isY的布尔值,有哪些最佳实践?

对于创建一个接受布尔值isX的构造函数,并根据该值需要isY的布尔值,有哪些最佳实践?
EN

Stack Overflow用户
提问于 2019-05-29 06:55:22
回答 2查看 74关注 0票数 2

在这个假设的问题中,我创建了一个类来表示香肠,它可以是: 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;
        }
    }
}

我正在寻找一种更干净的方式来提供这种功能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-29 07:07:33

可以将可能的状态表示为枚举类型:

enum SausageType {
    FreshPackaged,
    FreshUnpackaged,
    NotFresh;
}

然后更改您的构造函数以接受一个SausageType而不是两个Boolean

这种方法的优点是不可能使用错误的状态组合来调用构造函数,您的类的用户可以清楚地看到可能的值是什么,并且您不需要记住保持对参数的脆弱运行时检查以适应不断变化的需求。

票数 3
EN

Stack Overflow用户

发布于 2019-05-29 07:05:32

默默地将isPackaged更改为false可能会让调用代码感到惊讶。在这里,如果选择了组合(not fresh,packaged),则可以选择抛出异常。

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,而不是像实例变量那样在对象包装器Boolean中使用。在这里,Boolean允许的null值没有任何意义。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56351028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档