我想知道是否有人知道在Java中使用eclipse生成的更新,構造函數,等式,哈希,字符串等的好方法。 Lot的時間,在我使用自動生成的代碼存根後,我向類中添加了一個成員變量,然後我需要刪除自動生成的代碼,然後重新執行。 有沒有辦法讓eclipse將新變量添加到自動生成的代碼存根中?如何更新Java構造函數,equals,hash等。在日食?
編輯:確定刪除不是必需的,但是我仍然需要去生成它們中的每一個,我正在尋找一個自動解決方案。
我想知道是否有人知道在Java中使用eclipse生成的更新,構造函數,等式,哈希,字符串等的好方法。 Lot的時間,在我使用自動生成的代碼存根後,我向類中添加了一個成員變量,然後我需要刪除自動生成的代碼,然後重新執行。 有沒有辦法讓eclipse將新變量添加到自動生成的代碼存根中?如何更新Java構造函數,equals,hash等。在日食?
編輯:確定刪除不是必需的,但是我仍然需要去生成它們中的每一個,我正在尋找一個自動解決方案。
看看在www.projectlombok.org作爲自己編寫這些方法的替代方案。特別是@Data註釋似乎符合您的需求,請參閱http://www.projectlombok.org/features/Data.html。
Iv'e用一個字段創建了一個我自己的項目,並要求eclipse生成所有的基本方法。之後,我添加了一個新字段,我要求它再次生成這些方法(源代碼 - >生成...),它促使我替換舊字段,點擊「是」並顯示更新的方法。
希望它幫助
它沒有。我希望它自動更新,或者按下按鈕。正如你所說,我必須對所有存根再做一遍 – stdcall
這不正是你的問題的解決方案,但我不再使用Eclipse自動生成的方法,我用的是Apache commons langEqualsBuilder和HashCodeBuilder:
所以,例如你可以這樣做:
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
Yowzers,我敢打賭*這是*性能! :) –
那麼,如果你的對象是不可變的 - 我通常會試圖做 - 你可以緩存toString和hashCode的值,這將幫助很多。 – ArtB
@Ernest實際上這並不壞,這取決於你在做什麼。不必生成你自己的hashCode()和使用標準的優點,並且最重要的是,正確的hashCode勝過任何小的性能問題。 –
我認爲它比自動生成更正確得多。 Apache HashCode答案是要走的路。 – JohnKlehm