gpt4 book ai didi

kotlin - 验证构造函数中值的组合

转载 作者:行者123 更新时间:2023-12-02 01:31:53 24 4
gpt4 key购买 nike

我正在尝试开设类(class) Box<T> 。它应该有两个公共(public)不可变( val )属性, isContentMandatory: Boolean , content: T? 。这是我想要接受的值组合:

<表类=“s-表”><标题>isContentMandatory内容应该允许吗? <正文>假空是假非空是正确空没有正确非空是

我想确保我提供的构造函数不允许对象处于非法状态。另外,我想要多个构造函数(或使用默认值),以便客户端可以直接创建对象。以下是实例化示例:

Box()                        // OK -> isContentMandatory = false, content = null
Box("some-content") // OK -> isContentMandatory = false, content = "some-content"
Box(false, "some-content") // OK -> isContentMandatory = false, content = "some-content"
Box(true, "some-content") // OK -> isContentMandatory = true, content = "some-content"
Box(true, null) // DON'T ALLOW
Box(true) // DON'T ALLOW

DON'T ALLOW如果可能的话,最好在编译时禁止(没有可用于该组合的构造函数)。否则,创建时会失败并出现异常。

我来自 Java 世界,所以所有这些主/辅助构造函数、默认值等都有点模糊,所以请解释一下解决方案。如果支持相同的业务逻辑,我也愿意接受不同的类设计。

编辑:这就是 Java 中的外观。

public class Box<T> {

private final boolean isContentMandatory;
private final T content;

public Box() {
this(null);
}

public Box(T content) {
this(false, content);
}

public Box(boolean isContentMandatory, T content) {
if (isContentMandatory && content == null) {
throw new IllegalArgumentException("Invalid combination of parameters");
}
this.isContentMandatory = isContentMandatory;
this.content = content;
}

...getters...
}

最佳答案

如果没有您的用例的实际领域知识,很难回答这是否是解决问题的好方法,但在我看来,您创建一个类来模拟那些包含以下内容的案例是没有意义的:围绕一个(否则毫无意义?) bool 值来分隔案例。

您可以只拥有 2 个类 BoxWithOptionalcontent 和 BoxWithContent ,并且您只需要默认构造函数即可。

sealed interface Box<T: Any?> {
abstract val content: T?
}
data class BoxWithContent<T: Any>(override val content: T): Box<T>
data class BoxWithOptionalContent<T: Any?>(override val content: T? = null): Box<T?>

这在初始化站点上不会有太大变化,在使用方面,您可能需要添加一个 case 语句来决定它是哪种情况并进行适当的处​​理。但无论如何,您可能已经有一些类似的逻辑,这可能会更加类型安全和可读。

关于kotlin - 验证构造函数中值的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73125552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com