Java模式来构建必须设置任何一个字段的对象?

Java模式来构建必须设置任何一个字段的对象?,java,class,design-patterns,builder,builder-pattern,Java,Class,Design Patterns,Builder,Builder Pattern,我需要构建一个类的对象,该类有3个字段:a、B和C。一个有效的对象至少有一个由用户设置的a、B或C。我查看了,这接近于我想要的,但只有1个字段是必需的。我想要1个字段,它必须设置为我拥有的3个字段中的任意一个。有什么建议吗 我的替代方法是使用7个构造函数(对于{A}、{B}、{C}、{A,B}、{B,C}、{A,C}、{A,B,C})您可以使用一个构造函数。仅包含两个字段而非三个字段的简短示例: public final class MyBuilder { private X a, b;

我需要构建一个类的对象,该类有3个字段:a、B和C。一个有效的对象至少有一个由用户设置的a、B或C。我查看了,这接近于我想要的,但只有1个字段是必需的。我想要1个字段,它必须设置为我拥有的3个字段中的任意一个。有什么建议吗

我的替代方法是使用7个构造函数(对于{A}、{B}、{C}、{A,B}、{B,C}、{A,C}、{A,B,C})

您可以使用一个构造函数。仅包含两个字段而非三个字段的简短示例:

public final class MyBuilder
{
    private X a, b;

    public MyBuilder withA(X a)
    {
        b = null;
        this.a = a;
        return this;
    }

    public MyBuilder withB(X b)
    {
        a = null;
        this.b = b;
        return this;
    }

    public MyClass build()
    {
        if (a == null && b == null)
            barf(); // <-- throw exception here
        // A and B inherit MyClass
        return a != null ? new A(a) : new B(b);
    }
}
公共最终类MyBuilder
{
私人X a,b;
公共MyBuilder with a(X a)
{
b=零;
这个a=a;
归还这个;
}
公共MyBuilder与b(X b)
{
a=零;
这个.b=b;
归还这个;
}
公共MyClass构建()
{
如果(a==null&&b==null)
barf();//您可以使用构建器进行此操作。简短的示例仅包含两个字段,而不是三个字段:

public final class MyBuilder
{
    private X a, b;

    public MyBuilder withA(X a)
    {
        b = null;
        this.a = a;
        return this;
    }

    public MyBuilder withB(X b)
    {
        a = null;
        this.b = b;
        return this;
    }

    public MyClass build()
    {
        if (a == null && b == null)
            barf(); // <-- throw exception here
        // A and B inherit MyClass
        return a != null ? new A(a) : new B(b);
    }
}
公共最终类MyBuilder
{
私人X a,b;
公共MyBuilder with a(X a)
{
b=零;
这个a=a;
归还这个;
}
公共MyBuilder与b(X b)
{
a=零;
这个.b=b;
归还这个;
}
公共MyClass构建()
{
如果(a==null&&b==null)

barf();//您可以强制在build()方法中传递A、B或C:


您可以强制在build()方法中传递A、B或C:


“但是必须设置的字段不能更改”生成器模式实际上让您在构建实际对象之前确定您传递的生成器选项是否有效,我看不出这里有什么问题。例如:new Bulder()。With a(a).build()成功,new builder().build()失败。我不知道这一点。“但是必须设置的字段不能更改”生成器模式实际上允许您在构建实际对象之前确定您传递的生成器选项是否有效,我不认为这里有问题。例如:new Bulder().With a(a).build()成功,new builder().build()成功失败,汉克斯。我不知道。谢谢。我应该对建筑者模式做更多的敷衍。你甚至可以做得更好……建筑者模式非常强大。谢谢。我应该对建筑者模式做更多的敷衍。你甚至可以做得更好……建筑者模式非常强大邪恶的