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

时间:2017-07-03 05:22:39

标签: 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;

    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;
    }
}

现在,我有一个用例,我需要在Team类中设置ID的新值。我认为我应该在类中为此设置一个setter(将id声明为非final)并使用它。但是,我也认为我应该继续制作一个建造者并使用它。虽然写一个二传手的工作量较少,但我想确保自己能够采用正确的模式。在这种情况下推荐什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果想要更改对象的(单个)属性,则不应使用构建器模式。

  

Builder模式解决了大量可选的问题   通过提供构建方法的参数和不一致状态   对象一步一步地提供一个实际返回的方法   最终对象。 source: JournalDev

当您只想更新现有类的单个属性时,使用setter完全没问题,实际上就是它们的用途。

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

答案 1 :(得分:0)

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

不要让你的'id'变量不是最终的。我假设你的对象可以并且在其存在的整个持续时间内只有一个常量'id'值。这正是'最终'的目的。使其成为非最终决定完全违背了“最终”的目的。

所以保持'id'变量'final'。在你的switch案例中,获取你想要的任何id值并将其放入变量中,并且在使用构建器构建Team对象时,在switch case之外使用该id变量。

希望这很清楚。

答案 2 :(得分:0)

在第一个实例中,它看起来像一个java bean类(如果你想要的只是一个带有默认构造函数的getter和setter,而这个默认构造函数在你的类中不存在,因为我不想让所有参数传入构造函数)。此外,如果将来你想添加let-say 4-5变量,那么你的代码将会中断,因为你必须修改你的构造函数,这是可以避免的。

其次,你在为变量添加final并消除setter导致你想要创建一个可变类的方向,那么在这种情况下你也应该让你的类成为最终的。

在构造函数中包含如此多参数的面时,请考虑使用构建器模式。

此外,您不应该允许id的任何setter属性。而是使用新的Id值创建一个新实例。 这就是可变性的工作方式,并且可以避免新的错误。