我研究了这个主题并发现通过构造函数分配字段是一种更好的做法而不是设置者。但是,如果我有10个字段的对象怎么办?这会导致大型建筑师,这仍然被视为良好做法吗?
例如:
public DefaultAccount(Long id, String name, String surname, String username, String password, Role role) {
this.id = id;
this.name = name;
this.surname = surname;
this.username = username;
this.password = password;
this.role = role;
}
这个构造函数对我来说很重要。
答案 0 :(得分:2)
带有许多参数(或具有多个构造函数,使用不同参数集)的构造函数的一个问题是当多个参数具有相同类型时可能发生的错误。从你的例子中考虑如何容易地得到名称和姓氏的顺序。
解决方法可能是使用Builder模式。
以下是对其工作原理的全面了解:the builder pattern in practice 以下堆栈溢出问题也很好地涵盖了它:when would you use the builder pattern
答案 1 :(得分:1)
实际上在任何方法(包括构造函数)中都有大量参数是一种不好的做法。
首先,我看到DefaultAccount构造函数的字段与Account没有直接关系。
您应该将名称和姓氏提取到另一个(User?)类等等。
答案 2 :(得分:1)
在我看来,这取决于具体情况。您列出的示例是一个非常简单的类,只有简单类型。我会认为没事。但是,我不太确定你的陈述是否考虑了制定者。但是你可能需要考虑一些事情:
如果你正在使用一些更大的框架(Spring,Hibernate ......),很多框架将使用默认构造函数(如new Person())实例化对象,然后调用字段的setter。如果没有可用的东西,他们会抛出异常。
有一个像你列出的那样的构造函数是好的。但无论如何都需要安装者。如果它们变得复杂,请考虑重构该类。可能需要太多依赖项。也许你可以将它们封装在另一个对象中(例如配置)而不是10个参数。
尽量不要公开字段。在某些时候你必须检查一个setter中的某个条件并且你的字段是公开的,你将花一些时间来重构它。如果需要,检查setter中的前提条件并抛出异常。
我还在stackoverflow上发现了这个问题,它更进一步解决了setter的问题:Java setting private fields inside constructors
答案 3 :(得分:1)
如果不是所有参数都是强制性的,那么考虑使用Joshua Bloch的有效Java第2项中建议的 Builder 模式,其中说......
客户端调用a而不是直接创建所需的对象 具有所有必需参数的构造函数(或静态工厂) 并获取构建器对象。然后客户端调用类似setter的方法 在构建器对象上设置每个感兴趣的可选参数。 最后,客户端调用无参数
build
方法来生成 对象,这是不可变的。
答案 4 :(得分:1)
在我看来,最有效的方法是将问题分解为尽可能多的类,如下:
public DefaultAccount(Long id, String name, String surname, User user)
{
this.id = id;
this.name = name;
this.surname = surname;
this.user = user;
}
// From second class User
public User(String username, String password, Role role)
{
this.username = username;
this.password = password;
this.role = role;
}
这样可以避免使用庞大的构造函数,并提高代码的可维护性和可读性。
您也可以使用配置类,如here所述。
答案 5 :(得分:0)
getter和setter,当你的字段是私有的(或受保护并且需要从另一个包访问时)也是如此。 如果您只有一个课程,则不需要创建getter和setter,您可以直接将值分配给对象(假设您不想在构造函数中分配它们)