用Java中的许多参数管理构造函数

在我们的一些项目中,有一个类层次结构可以在链条上添加更多参数。 在底部,一些类可以有多达30个参数,其中28个只传递给超级构造函数。

我会承认,通过像Guice这样的自动化DI会很好,但是由于某些技术原因,这些特定的项目都受限于Java。

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

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


Builder设计模式可能会有所帮助。 考虑下面的例子

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();

如果我们忽略必需的字段(大概需要名称),那么我们可以让Student构造函数抛出异常。 它可以让我们拥有默认/可选参数,而无需跟踪任何类型的参数顺序,因为这些调用的任何顺序都可以很好地工作。


你可以在对象中封装相关参数吗?

例如,如果参数是类似的


MyClass(String house, String street, String town, String postcode, String country, int foo, double bar) {
  super(String house, String street, String town, String postcode, String country);
  this.foo = foo;
  this.bar = bar;

那么你可以改为:


MyClass(Address homeAddress, int foo, double bar) {
  super(homeAddress);
  this.foo = foo;
  this.bar = bar;
}


你可能想要做的是有一个Builder类。 然后你会做这样的事情:

MyObject obj = new MyObjectBuilder().setXxx(myXxx)
                                    .setYyy(myYyy)
                                    .setZzz(myZzz)
                                    // ... etc.
                                    .build();

请参阅此Josh Bloch演示文稿(PDF)的第8页和后续内容,或有效Java的此评论

链接地址: http://www.djcxy.com/p/3543.html

上一篇: Managing constructors with many parameters in Java

下一篇: Proper way to declare custom exceptions in modern Python?