2009-07-13 79 views
15

如果一個類包含一個名爲「blah」的變量,那麼標準的getter/setter語法顯然是getBlah()和setBlah()。但如果我有一個名爲isBlah的變量的POJO類,我會使用:POJO類中的「is」變量getter/setter的正確語法是什麼?

public type getIsBlah() { 
    return isBlah; 
} 

public setIsBlah(type isBlah) { 
    this.isBlah = isBlah; 
} 

或者它會是這樣嗎?

public type isBlah() { 
    return isBlah; 
} 

public setBlah(type blah) { 
    this.isBlah = blah; 
} 

第一似乎更加嚴格符合POJO公約,但第二個類型是什麼的IntelliJ產生,如果我問它使一個類的getter/setter方法(哎,的IntelliJ從來沒有讓我失望過:])。那麼哪個是首選語法?

回答

20

使用屬性的一個原因是將API從實現中分離出來。換句話說,你不應該被你調用的私有變量所束縛。除了試圖讓代碼維護者保持可讀性之外,這不應該通知命名。

我想說如果在這種情況下「類型」是boolean,那麼第二種形式是正確的。如果是而不是boolean,您應該使用getXXX - 但我可能不會使用getIsXXX。對我而言,「是」與布爾屬性具有非常強的對應關係,並且在其他上下文中使用它不僅會打破JavaBeans約定(這會影響其他工具),而且會誤導IMO。

+3

打破JavaBeans約定+1 +1 – 2009-07-13 08:38:56

+5

@Vincent:我假設你的意思是「+1提及它會違反JavaBeans約定」 - 而不是「+1 - 成爲會議破壞者!」 :) – 2009-07-13 08:44:35

3

不會說POJO有很強的約定,但對於JavaBeans第二個(IntelliJ)例子是布爾屬性的標準,其他所有使用getX

2

我也會選擇你的第二個選項。第一個,getIsBlah()似乎羅嗦和多餘。

1

「get」和「is」實際上都不錯,因爲在技術上它們在JavaBeans約定下仍然可以接受。我會選擇更好或更自然的聲音,具體取決於你的「Blah」實際上是什麼詞。

3

如果您使用JSTL,那麼就是「is」語法存在一個大問題,那就是JSTL EL無法識別它們。這很愚蠢,但JSTL EL的設計者並沒有去檢查他們的邏輯是否符合javabeans。

我經常發現自己在我的視圖層類中調用getIsBlah()方法,它調用isBlah(),只是爲了給JSTL一個鉤子。這太糟糕了。

4

請注意,該字段的名稱與JavaBean specification完全不相關。只有getter/setter的名字是相關的。

通常,吸氣劑的名稱是get<PropertyName>()。只有boolean屬性是is<PropertyName>()允許作爲替代。

請注意,在您的示例中,當您調用getter isBlah()時,Bean屬性名稱爲「Blah」,當您調用getter getIsBlah()時,它的「IsBlah」。

我個人通常更喜歡isBlah()

0

JSTL只允許isMyBool,如果它是一個布爾值,而不是布爾值或任何其他對象,按照bean規範。 (原始vs對象)。

0

這意味着JAXB生成不正確的代碼。它創建了Boolean屬性,因爲它們需要爲空,但仍然命名爲他們的獲取者isXXX(),這違反了Bean規範。