Java 首选什么,使用setter或builder?

Java 首选什么,使用setter或builder?,java,setter,builder,Java,Setter,Builder,我有一门课是这样的: public class Team { private final String id; private final String subOrgId; private final String teamName; private final String costCenter; private final String email; private final String seaSecurityGroup;

我有一门课是这样的:

public class Team
{
    private final String id;

    private final String subOrgId;

    private final String teamName;

    private final String costCenter;

    private final String email;

    private final String seaSecurityGroup;

    private final String expesoSecurityGroup;

    public Team(final String id, final String subOrgId, final String teamName, final String costCenter,
            final String email, final String seaSecurityGroup, final String expesoSecurityGroup)
    {
        this.id = id;
        this.subOrgId = subOrgId;
        this.teamName = teamName;
        this.costCenter = costCenter;
        this.email = email;
        this.seaSecurityGroup = seaSecurityGroup;
        this.expesoSecurityGroup = expesoSecurityGroup;
    }

    public String getId()
    {
        return id;
    }

    public String getSubOrgId()
    {
        return subOrgId;
    }

    public String getTeamName()
    {
        return teamName;
    }

    public String getCostCenter()
    {
        return costCenter;
    }

    public String getEmail()
    {
        return email;
    }

    public String getSeaSecurityGroup()
    {
        return seaSecurityGroup;
    }

    public String getExpesoSecurityGroup()
    {
        return expesoSecurityGroup;
    }
}
现在,我有一个用例,在这个用例中,我需要在类团队中设置ID的新值。我的意见是,我应该在类中为此(声明id为非final)创建一个setter,并使用它。然而,我也认为我应该继续制作一个生成器并使用它。虽然写一个二传者的工作要少一些,但我想确保我的模式是正确的。在这种情况下,建议采取什么措施


谢谢

在您提供的示例中,有许多私有变量要为对象设置,所有这些都是最终的;在这种情况下,使用builder模式是理想的。在这种情况下,setter不是很有用,因为它只会使用一次(因为所有对象变量都是最终的)

不要将“id”变量设为非最终变量。我假设你的对象在其存在的整个过程中只能有一个常量“id”值。这正是“决赛”的目的。让它成为非最终的完全违背了“最终”的目的

因此,保留“id”变量“final”。在您的切换案例中,获取您想要的任何id值并将其放入变量中,当使用生成器构建团队对象时,在您的切换案例之外使用该id变量


希望这是清楚的。

首先,它看起来像一个JavaBean类(如果这就是您想要的,那么就有一个getter和setter以及一个默认构造函数,而这个默认构造函数不在您的类中,因为我不希望所有的参数都在构造函数中传递)。此外,如果将来您想添加4-5变量,那么您的代码将中断,因为您必须修改构造函数,这是可以避免的

第二,将final添加到变量中,并消除setter引导您创建可变类的方向,在这种情况下,您还应该将您的类作为final

当构造函数中有这么多参数时,考虑使用生成器模式

此外,您不应允许id具有任何setter属性。而是使用新id值创建一个新实例。
这就是易变性的工作原理,有助于避免新的bug。

如果要更改对象的(单个)属性,则不应使用生成器模式

Builder模式解决了大量可选项的问题 参数和不一致状态,通过提供一种方法来构建 对象,并提供一个实际返回 最后一个目标

当您只想更新现有类的单个属性时,使用
setter
非常好,实际上这就是它们的用途


很难评估在不知道应用程序上下文的情况下更改该对象的ID是否有意义。使用新ID创建新对象也可能是一个选项

只有您可以确定,但这看起来像其他任何可能是JavaBean的POJO。我认为这是一个构建器,而不是正确的模式。当你想使用不可变对象时,你可以添加一个setter,它创建一个新的实例,只改变设置的值。如果这个不可变的类已经在使用,我不会不认真考虑就将它分解成一个可变的类,如果它已经在使用,那么很可能已经假设它是不可变的。