2011-10-01 75 views
14

我想知道是否有人知道在Java中使用eclipse生成的更新,構造函數,等式,哈希,字符串等的好方法。 Lot的時間,在我使用自動生成的代碼存根後,我向類中添加了一個成員變量,然後我需要刪除自動生成的代碼,然後重新執行。 有沒有辦法讓eclipse將新變量添加到自動生成的代碼存根中?如何更新Java構造函數,equals,hash等。在日食?

編輯:確定刪除不是必需的,但是我仍然需要去生成它們中的每一個,我正在尋找一個自動解決方案。

+0

我認爲它比自動生成更正確得多。 Apache HashCode答案是要走的路。 – JohnKlehm

回答

4

看看在www.projectlombok.org作爲自己編寫這些方法的替代方案。特別是@Data註釋似乎符合您的需求,請參閱http://www.projectlombok.org/features/Data.html

+0

這很好。但它有一個缺點。當從其他類引用sets,gets等時,eclipse將不知道如何自動完成(使用CTRL +空格鍵),因爲這些方法在飛行中生成... – stdcall

+1

實際上,自動完成功能也起作用,請檢查文檔。 – Kevin

+0

有趣,我會檢查出來 – stdcall

2

Iv'e用一個字段創建了一個我自己的項目,並要求eclipse生成所有的基本方法。之後,我添加了一個新字段,我要求它再次生成這些方法(源代碼 - >生成...),它促使我替換舊字段,點擊「是」並顯示更新的方法。

希望它幫助

+0

它沒有。我希望它自動更新,或者按下按鈕。正如你所說,我必須對所有存根再做一遍 – stdcall

6

這不正是你的問題的解決方案,但我不再使用Eclipse自動生成的方法,我用的是Apache commons langEqualsBuilderHashCodeBuilder

所以,例如你可以這樣做:

import org.apache.commons.lang3.builder.EqualsBuilder; 
import org.apache.commons.lang3.builder.HashCodeBuilder; 
import org.apache.commons.lang3.builder.ReflectionToStringBuilder; 

public class EqualsTest { 
    private String foo; 
    private int bar; 

    // getters and setters 

    @Override 
    public String toString() { 
     return ReflectionToStringBuilder.toString(this); 
    } 

    @Override 
    public int hashCode() { 
     return HashCodeBuilder.reflectionHashCode(this); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return EqualsBuilder.reflectionEquals(this, obj); 
    } 
} 

這使用反射,並且當你添加一個字段時不需要改變。但是,還有其他選項可以指定要使用的字段,以及是否還要考慮超類的hashCode。

編輯:正如已經指出的那樣,反射方面可能會有一些相關的性能損失。就個人而言,我並沒有在生產代碼中使用反射HashCodeBuilder或EqualsBuilder,我使用toHashCode(如下所示)。不過我使用ReflectionToStringBuilder進行日誌記錄等。

這裏是不使用反射的例子,但需要你的時候你添加一個字段添加另一行:

public int hashCode() { 
    // you pick a hard-coded, randomly chosen, non-zero, odd number 
    // ideally different for each class 
    return new HashCodeBuilder(17, 37). 
    append(foo). 
    append(bar). 
    toHashCode(); 
} 

有關hashCodeBuilder更多的討論,請參閱apache commons equals/hashcode builder

+0

Yowzers,我敢打賭*這是*性能! :) –

+0

那麼,如果你的對象是不可變的 - 我通常會試圖做 - 你可以緩存toString和hashCode的值,這將幫助很多。 – ArtB

+0

@Ernest實際上這並不壞,這取決於你在做什麼。不必生成你自己的hashCode()和使用標準的優點,並且最重要的是,正確的hashCode勝過任何小的性能問題。 –