2011-08-30 60 views
5

我對類中用於設置信息的方法創建有懷疑。在類中聲明方法的首選方法

  1. 創建用於設置每個屬性

    class Address{ 
        private String name; 
        private String city; 
    
        public setName(String name) { ... } 
        public setCity(String name) { ... } 
    } 
    
  2. 用於設置所有創建單個方法不同的方法屬性

    class Address{ 
        private String name; 
        private String city; 
    
        public setAddress(String name,String city) { ... } 
    } 
    
從以上兩種方式

這在存儲器點優選視圖?

+2

向我們展示兩種方法的代碼示例的含義。 –

+0

這個班的目的是什麼?它是一個價值對象嗎?你需要獨立設置每個值嗎?創建對象後,這些值是否必須改變? 「記憶的角度」是什麼意思?人類記憶或計算機記憶? – buritos

+0

第一個例子很好,第二個例子很糟糕。使用構造函數。 – BalusC

回答

1

這不是一個明確的問題。你的意思是說,你寧願有兩種方法,如setFoo(String)setBar(int),或者一種方法如setFooBar(String, int)?這實際上取決於這些屬性在邏輯上是不同的,在這種情況下,您需要單獨的方法,或者它們是否經常(或僅)有意義將它們設置在一起。你可以提供兩者。

對記憶沒有任何影響,沒有。

3

我看不出這兩種方法是不同的記憶方式。

選擇在班級界面中最有意義的方法。

如果兩個屬性在邏輯上強相關,或者有一些不想暫時中斷(甚至是暫時)的類不變,我會推薦使用方法2。

在你的Address的例子中,我肯定會用兩個設置方法,因爲當談到地址時,名字和城市是非常不相關的。


對於一般方法我會說,你是否一分爲二的方法了對內存的消耗影響很小。每個對象都沒有獲得自己分配的一組方法。包含這些方法的內存在類的所有實例之間共享。


經驗法則:力求使您的類的界面乾淨,符合邏輯的。

0

您通常會爲每個屬性編寫一個setter和getter方法。

當一種方法足以設置所有屬性時,我並不真正看到這種情況。在這種情況下,所有屬性應該具有相同的值?或者你總是必須傳遞所有屬性的參數。這兩種情況都不是你想要的。所以你應該更喜歡你的第一種方法。

2

爲什麼不使用2

不建議你的第二個例子,因爲如果添加一個新的領域地址類方法#,那麼你將它添加到現有的setter方法還是你創建新的setter方法?如果將它添加到現有的setter方法中,那麼調用該方法的任何類都將被打破。如果你創建了一個新的setter方法,那麼任何想要使用這個類的人都會感到困惑,爲什麼某些字段以這種方式組合在一起,而另一些則不是。

使用爲您希望揭露

常見的做法是,在你的類,你想公開的每個字段一個setter方法每場單獨的setter方法(即你的第一個例子) 。這是否是一種好的做法是值得商榷的,因爲它迫使一個班級成爲mutable.如果可能的話,最好讓一個對象不可變,for a number of reasons

使用構造

的一種方法,使一類不可變的初始化你的領域是擺脫的setter方法,而是讓你的領域通過您的類的構造函數可設置,如下圖所示。以這種方式實現它的缺點是,如果你的類有很多字段,它可能會導致大的,不可讀的構造函數調用。

public class Address { 
    public String name; 
    public String city; 

    private Address(String name, String city) { 
     this.name = name; 
     this.city = city; 
    } 
} 

初始化使用Builder模式

下面是一個完全的替代實現(通過this article啓發),這是Builder模式的變化你的領域。它模擬對象可變性而不犧牲可讀性。

Address address = new Address.Builder() 
     .name("Mansoor's address") 
     .city("Toronto") 
     .build(); 

哪種方法使用更多的內存:

public class Address { 
    public String name; 
    public String city; 

    private Address() {} 

    private void setName(String name) { 
     this.name = name; 
    } 

    private void setCity(String city) { 
     this.city = city; 
    } 

    static class Builder { 
     private Address address = new Address(); 

     public Builder name(String name) { 
      address.setName(name); 
      return this; 
     } 

     public Builder city(String city) { 
      address.setCity(city); 
      return this; 
     } 

     public Address build() { 
      return address; 
     } 
    } 
} 

有了上面的類,你可以按如下方式創建Address類的不變實例?

從內存的角度來看,應該沒有什麼區別,因爲內存中類的大小取決於類中的字段。由於所有三個實現都具有相同的字段,因此無論使用哪種方法,它們都應占用相同的內存空間量。

+0

它的意思只是我要求setter方法..關於我的任何方法 – satheesh

+0

評論我的答案中的「一般方法」方面。 – aioobe

+0

我不同意你的回答。爲什麼通常的做法是爲每個領域設置制定者?一個班級內部的領域往往不願意公開。我知道這是常見做法的唯一地方就是豆類。 – Farmor

1

Nb.1毫無疑問。

而你不用手寫代碼,只聲明你的字段。

然後你讓Eclipse爲你休息。

在Eclipse中使用Source - > generate getters and setters。

在對象構造函數中完成了與#2非常相似的構造。

關於內存的更新問題。在生產代碼中,不要擔心這兩種方式之間的內存差異。

+0

1號是常見的做法,但它強迫一個類是可變的。 –

+1

你是什麼意思? setAddress(「London」,「Uk」)和[setName(「Uk」)setCity(「London」)]是否同樣可變? – Farmor

+0

他們會 - 我所說的都不是最好的方法。 :) –

4

常見的做法是使用JavaBean風格的

class Address { 
    private String name; 
    private String city; 

    public setName(String name){ 
    this.name = name; 
    } 

    public String getName() { 
    return name; 
    } 

    public setCity(String city){ 
    this.city = city; 
    } 

    public getCity() { 
    return city; 
    } 

}

另一種常見的做法,這是相當類似於您第二種方法是創建不可變對象。參數傳遞給構造函數而不是大的setter方法。

class Address { 
    private final String name; 
    private final String city; 

    public Address(String name, String city) { 
     this.name = name; 
     this.city = city; 
    } 

    public String getName() { 
    return name; 
    } 

    public getCity() { 
    return city; 
    } 
} 

從視圖存儲器點,差異將是第二個例子是設置在構造所有屬性和所有這些屬性是不可變的。一般來說,用這種方法構建的對象在被多個線程使用時更安全。

在第二示例中,沒有必要進行同步。當使用標準JavaBean對象的多線程時,您需要處理同步/內存問題。