2011-10-01 14 views
14

Chciałem się dowiedzieć, czy ktoś wie o dobrym sposobie aktualizacji, konstruktorów, równań, haszów, ciągów itd. Generowanych przez środowisko Eclipse w Javie. Dużo czasu, po tym jak korzystam z automatycznie wygenerowanych kodów pośredniczących, dodam zmienną do klasy, a następnie muszę usunąć automatycznie wygenerowany kod i zrobić to od nowa. Czy istnieje sposób spowodowania zaćmienia w celu dodania nowej zmiennej do automatycznie wygenerowanych kodów pośredniczących?jak zaktualizować konstruktorów Java, równa, hasz itp. w zaćmieniu?

edytuj: ok kasowanie nie jest niezbędne, jednak nadal muszę je generować, szukam automatycznego rozwiązania.

+0

Uważam, że o wiele ważniejsze jest, aby był poprawny niż generowany automatycznie. Odpowiedź na pytanie Apache HashCode jest drogą do zrobienia. – JohnKlehm

Odpowiedz

4

Spójrz na stronie www.projectlombok.org jako alternatywa dla samodzielnego pisania tych metod. W szczególności adnotacja @Data wydaje się pasować do twoich potrzeb, zobacz http://www.projectlombok.org/features/Data.html.

+0

To jest miłe. ale ma tę wadę. podczas porównywania zestawów, pobiera itp z innej klasy, eclipse nie będzie wiedzieć, jak automatycznie wypełnić (przy użyciu CTRL + SPACE), ponieważ metody te są generowane w locie ... – stdcall

+1

Rzeczywiście autouzupełnianie działa również, sprawdź dokumenty. – Kevin

+0

ciekawe, sprawdzę to – stdcall

2

Ja stworzyłem własny projekt z jednym polem i poprosiłem o zaćmienie, aby wygenerować wszystkie podstawowe metody. Potem dodałem nowe pole, poprosiłem o wygenerowanie tych metod ponownie (źródło -> generowanie ...), zachęciło mnie to do zastąpienia starych, kliknąłem "tak" i zaktualizowano metody.

Nadzieję, że pomogło

+0

Nie udało się. Chcę, aby był aktualizowany automatycznie lub za pomocą przycisku. jak już powiedziałeś, muszę zrobić to jeszcze raz dla wszystkich odcinków. – stdcall

6

To nie jest dokładnie to rozwiązanie do Twojego pytania, ale ja już używać automatycznie wygenerowane metody Eclipse używam Apache commons langEqualsBuilder i HashCodeBuilder:

Tak więc, na przykład możesz zrobić:

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); 
    } 
} 

Używa refleksji i nie wymaga zmiany przy dodawaniu pola. Istnieją jednak inne opcje, w których można określić pola, które mają być używane, i jeśli chcemy uwzględnić również kod haszowania superklasy.

EDYCJA: Jak podkreślono, aspekt odbicia może mieć pewne kary za wydajność. Osobiście nie używam odbicia HashCodeBuilder lub EqualsBuilder w kodzie produkcyjnym, używam toHashCode (jak poniżej). Korzystam jednak z ReflectionToStringBuilder do rejestrowania i tym podobnych.

Oto przykład, który nie korzysta z refleksji, ale wymaga, aby dodać kolejną linię gdy dodać pole:

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(); 
} 

Więcej dyskusji na temat hashCodeBuilder patrz apache commons equals/hashcode builder

+0

Yowzers, założę się * to jest * wydajność! :) –

+0

Cóż, jeśli twoje obiekty, które są niezmienne - co zwykle próbuję zrobić - możesz buforować wartości dla toString i hashCode, które bardzo by pomogły. – ArtB

+0

@Ernest To naprawdę nie jest złe, to zależy od tego, co robisz. Zalety polegające na tym, że nie trzeba generować własnego hashCode() i przy użyciu standardu, a przede wszystkim poprawnego kodu hash, przeważają nad jakimiś mniejszymi problemami z wydajnością. –