一尘不染

在 Java 中管理具有许多参数的构造函数

javascript

在我们的一些项目中,有一个类层次结构,随着它沿着链向下添加更多参数。在底部,一些类最多可以有 30 个参数,其中 28 个只是传递给超级构造函数。

我承认通过 Guice 之类的工具使用自动化 DI 会很好,但由于某些技术原因,这些特定项目仅限于 Java。

按类型按字母顺序组织参数的约定不起作用,因为如果重构类型(您为参数 2 传入的 Circle 现在是 Shape),它可能会突然出现故障。

这个问题可能是具体的并且充满了“如果这是你的问题,那么你在设计层面做错了”的批评,但我只是在寻找任何观点。


阅读 222

收藏
2022-02-13

共1个答案

一尘不染

考虑以下示例

public class StudentBuilder
{
    private String _name;
    private int _age = 14;      // this has a default
    private String _motto = ""; // most students don't have one

    public StudentBuilder() { }

    public Student buildStudent()
    {
        return new Student(_name, _age, _motto);
    }

    public StudentBuilder name(String _name)
    {
        this._name = _name;
        return this;
    }

    public StudentBuilder age(int _age)
    {
        this._age = _age;
        return this;
    }

    public StudentBuilder motto(String _motto)
    {
        this._motto = _motto;
        return this;
    }
}

这让我们可以编写如下代码

Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
                 .name("Spicoli")
                 .age(16)
                 .motto("Aloha, Mr Hand")
                 .buildStudent();

如果我们省略了一个必填字段(可能是 name 是必需的),那么我们可以让 Student 构造函数抛出异常。它让我们拥有默认/可选参数,而无需跟踪任何类型的参数顺序,因为这些调用的任何顺序都同样有效。

2022-02-13