gpt4 book ai didi

java - 如何改进 builder 模式?

转载 作者:IT老高 更新时间:2023-10-28 20:46:22 24 4
gpt4 key购买 nike

动机

最近我在寻找一种方法来初始化一个复杂的对象,而无需将大量参数传递给构造函数。我尝试使用构建器模式,但我不喜欢这样一个事实,即我无法在编译时检查是否真的设置了所有需要的值。

传统的 builder 模式

当我使用构建器模式创建我的 Complex 对象时,创建更加“类型安全”,因为更容易看到参数的用途:

new ComplexBuilder()
.setFirst( "first" )
.setSecond( "second" )
.setThird( "third" )
...
.build();

但现在我有一个问题,我很容易错过一个重要的参数。我可以在 build() 方法中检查它,但这只是在运行时。在编译时,如果我遗漏了什么,没有任何东西可以警告我。

增强的构建器模式

现在我的想法是创建一个构建器,如果我错过了所需的参数,它会“提醒”我。我的第一次尝试是这样的:

public class Complex {
private String m_first;
private String m_second;
private String m_third;

private Complex() {}

public static class ComplexBuilder {
private Complex m_complex;

public ComplexBuilder() {
m_complex = new Complex();
}

public Builder2 setFirst( String first ) {
m_complex.m_first = first;
return new Builder2();
}

public class Builder2 {
private Builder2() {}
Builder3 setSecond( String second ) {
m_complex.m_second = second;
return new Builder3();
}
}

public class Builder3 {
private Builder3() {}
Builder4 setThird( String third ) {
m_complex.m_third = third;
return new Builder4();
}
}

public class Builder4 {
private Builder4() {}
Complex build() {
return m_complex;
}
}
}
}

如您所见,构建器类的每个 setter 都返回不同的内部构建器类。每个内部构建器类只提供一个 setter 方法,最后一个只提供一个 build() 方法。

现在对象的构造又是这样的:

new ComplexBuilder()
.setFirst( "first" )
.setSecond( "second" )
.setThird( "third" )
.build();

...但是没有办法忘记所需的参数。编译器不会接受它。

可选参数

如果我有可选参数,我会使用最后一个内部构建器类 Builder4 来设置它们,就像“传统”构建器所做的那样,返回自身。

问题

  • 这是众所周知的模式吗?它有什么特别的名字吗?
  • 您发现任何陷阱吗?
  • 您有什么想法可以改进实现 - 就减少代码行的意义而言?

最佳答案

传统的构建器模式已经解决了这个问题:只需在构造器中获取强制参数。当然,没有什么能阻止调用者传递 null,但您的方法也不会。

我看到你的方法的一个大问题是你要么有大量强制参数的类的组合爆炸,要么强制用户在一个特定的序列中设置参数,这很烦人。

另外,还有很多额外的工作。

关于java - 如何改进 builder 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1638722/

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