Java 通过setter或构造函数分配多个字段

Java 通过setter或构造函数分配多个字段,java,constructor,field,setter,Java,Constructor,Field,Setter,我对这个主题进行了研究,发现通过构造函数分配字段比通过setter分配字段更好。但是,如果我有一个有10个字段的对象呢?这将导致大的建造商,这仍然是良好的做法吗 例如: public DefaultAccount(Long id, String name, String surname, String username, String password, Role role) { this.id = id; this.name = name; this.surnam

我对这个主题进行了研究,发现通过构造函数分配字段比通过setter分配字段更好。但是,如果我有一个有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;
   }

在我看来,这个构造函数很大。

当您有多个类时,会使用getter和setter,当您的字段是私有的(或受保护的,需要从另一个包访问)时,也会使用getter和setter。
如果您只有一个不需要创建getter和setter的类,那么可以直接将值分配给对象(假设您不想在构造函数中分配它们)

当您有多个类时,会使用getter和setter,当您的字段是私有的时,也会使用getter和setter(或受保护且需要从其他包访问)。
如果您只有一个不需要创建getter和setter的类,那么可以直接将值分配给对象(假设您不想在构造函数中分配它们)

在任何方法(包括构造函数)中实际有大量参数都是一种不好的做法

首先,我看到DefaultAccount构造函数的字段与Account没有直接关系


例如,您应该将名称和姓氏提取到另一个(User?)类等。

在任何方法(包括构造函数)中实际具有大量参数是一种不好的做法

首先,我看到DefaultAccount构造函数的字段与Account没有直接关系


例如,您应该将姓名和姓氏提取给另一个(用户?)类,等等。在我看来,这取决于情况。你列举的例子是一个非常简单的类,只有简单的类型。我会认为这是正确的。但是,我不太确定你的陈述考虑SETTER。但有一些事情你可能要考虑:

如果您使用的是一些较大的框架(Spring、Hibernate…),其中许多框架将使用默认构造函数(如new Person())实例化对象,然后调用字段设置器。如果某些框架不可用,它们将抛出异常

有一个与你列出的构造函数类似的构造函数,但是无论如何都需要设置器。如果考虑复杂的话,考虑重构类。可能需要太多的依赖项。也许不是有10个参数,而是可以将它们封装在另一个对象(例如配置)中。

尽量不要将字段公开。在某个时候,您必须检查setter中的某个条件,并且您的字段是公开的,您将花费一些时间重构该条件。如果需要,请检查setter中的前提条件,并抛出异常


我也在StAdvExcel上发现了这个问题,它对SET的问题有一点深入:

我认为这取决于情况。你列出的例子是一个非常简单的类,只有简单的类型。我会认为这是正确的。但是,我不太确定考虑SETTER的语句。但是有一些东西。ng您可能需要考虑:

如果您使用的是一些较大的框架(Spring、Hibernate…),其中许多框架将使用默认构造函数(如new Person())实例化对象,然后调用字段设置器。如果某些框架不可用,它们将抛出异常

有一个与你列出的构造函数类似的构造函数,但是无论如何都需要设置器。如果考虑复杂的话,考虑重构类。可能需要太多的依赖项。也许不是有10个参数,而是可以将它们封装在另一个对象(例如配置)中。

尽量不要将字段公开。在某个时候,您必须检查setter中的某个条件,并且您的字段是公开的,您将花费一些时间重构该条件。如果需要,请检查setter中的前提条件,并抛出异常


我也在StdAppOfder上发现了这个问题,它对SET的问题有一点进一步的了解:

< P>如果不是所有的参数都是强制性的,那么考虑使用Joshua Bloch的有效java中的第2条中所建议的Builder模式,它表示…

客户端调用 具有所有必需参数的构造函数(或静态工厂) 然后客户端调用类似setter的方法 在生成器对象上设置每个感兴趣的可选参数。 最后,客户端调用无参数的
build
方法来生成 对象,它是不可变的


如果不是所有的参数都是强制性的,那么考虑使用Joshua Bloch的有效java的第2条中所建议的Builder模式,它表示…

客户端调用 具有所有必需参数的构造函数(或静态工厂) 然后客户端调用类似setter的方法 在生成器对象上设置每个感兴趣的可选参数。 最后,客户端调用无参数的
build
方法来生成 对象,它是不可变的


一个构造了许多参数的构造函数的一个问题(或者有多个构造函数接受不同的参数集)是当几个参数具有相同的类型时可能发生的错误。从你的例子来看,如何容易地获得名称和姓氏的顺序是错误的。

解决这个问题的一个方法是使用Builder模式

以下是对其工作原理的全面介绍:
下面的堆栈溢出问题也很好地涵盖了:

< P>一个构造了许多参数的构造函数的问题(或者有多个构造函数来接受不同的参数集)是当几个参数具有相同类型时可能发生的错误。
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;
}