2017-07-03 150 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創建新對象也是一種選擇。

相關問題