我有一个这样的课程:
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)并使用它。但是,我也认为我应该继续制作一个建造者并使用它。虽然写一个二传手的工作量较少,但我想确保自己能够采用正确的模式。在这种情况下推荐什么?
谢谢!
答案 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值创建一个新实例。 这就是可变性的工作方式,并且可以避免新的错误。