2017-07-03 153 views
0

我有这样一个类:什么是首选,使用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; 
    } 
} 

现在,我已经在那里我需要设置类团队的ID的新值的使用情况。我认为我应该在课堂上为这个做一个二传手(宣布id为非最终)并使用它。但是,我也认为我应该继续做一个建设者并使用它。虽然写一个二传手很少工作,但我想确保我正在以正确的模式继续前进。在这种情况下推荐什么?

谢谢!

+0

只有你自己知道,但看起来像任何其他POJO可能是一个Javabean –

+0

在我看来,建设者不是正确的模式。当你想使用不可变的对象时,你可以添加一个setter,它只创建一个新的实例,只更改设置的值。 –

+0

我不会认为这个不可变类是一个没有认真思考的可变类,如果它已被使用,那么假设可能已被假定为不可变的。 –

回答

0

在你提供的例子中,你需要为对象设置很多私有变量,所有这些都是最终的;在这种情况下使用建造者模式将是理想的。 Setters在这种情况下并不是很有用,因为它只会被使用一次(因为所有的对象变量都是最终的)。

不要让你的'id'变量非最终。我假设你的对象可以并且在整个存在期间只有一个常量'id'值。这正是“最终”做出的。使其不完全彻底击败了“最终”的目的。

所以保持'id'变量'最终'。在你的开关盒中,获取你想要的任何id值并将其放入一个变量中,当使用该构建器构建Team对象时,在开关盒外使用该id变量。

希望这是明确的。

0

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

第二,然后你将变量添加到最终变量中,并且消除引发器导致你想创建一个可变类的方向,那么在这种情况下,你也应该让你的类成为最终的类。

考虑在构造函数中包含如此多参数的情况下有构建器模式。

此外,你不应该允许id的任何setter属性。而是用新的Id值创建一个新的实例。 这就是可变性的工作原理,并且很好地避免新的错误。

1

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

Builder模式通过提供一种方式来建立 对象一步一步,并提供实际上将返回 最终目标的方法解决了大量的可选参数 和不一致的状态的问题。 source: JournalDev

当你只是想更新现有类的一个属性,使用setter是完全正常的,那就是他们都是什么,其实。

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

相关问题