2013-07-22 14 views
29

Alcuni giorni fa siamo passati a Java 7 all'interno della mia azienda - finalmente! Jay \ o/Così ho scoperto la classe Objects e sono rimasto stupito dal modo in cui sono stati realizzati i metodi hashCode() e equals(), riducendo un sacco di codice boylerplate rispetto a quelli generati da eclipse per impostazione predefinita (ALT + SHIFT + S -> H).Come insegnare eclipse a generare equazioni compatte() e hashCode() dalla classe oggetti jdk 7?

Mi chiedevo se potevo modificare il comportamento predefinito dell'eclissi generato hashCode() e equals()?

Mi piacerebbe vedere questo:

@Override 
public int hashCode() 
{ 
    return Objects.hash(one, two, three, four/*, ...*/); 
} 

invece di questo:

@Override 
public int hashCode() 
{ 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((one == null) ? 0 : one.hashCode()); 
    result = prime * result + ((two == null) ? 0 : two.hashCode()); 
    result = prime * result + ((three == null) ? 0 : three.hashCode()); 
    result = prime * result + ((four== null) ? 0 : four.hashCode()); 
    // ... 
    return result; 
} 

Lo stesso vale per equals(). This is the article Ho preso questo da.

Qualche idea su come realizzare questo meglio?

+0

Per "Genera toString()" è possibile definire un modello nella pagina wizzard. Dovresti presentare un ticket su [eclipse-bugzilla] (https://bugs.eclipse.org/bugs/), forse aggiungeranno qualcosa di simile per l'hashcode eq + in futuro. Se lo fai, ti piace un biglietto simile, quindi tutti gli interessati possono farlo più volte! – Chriss

+0

Puoi anche ripiegare la funzione 'hashCode()' se non vuoi vederla. Penso che potrebbe essere una buona idea considerare se l'implementazione di default è quella che vuoi in tutti i casi possibili in futuro. Impostando per default l'espressione stenografica si rinuncia alla flessibilità nel modificare l'hashCode (non irreversibile, ovviamente), se si desidera/deve farlo. Vedi http://stackoverflow.com/questions/12076846/using-a-larger-prime-as-a-multiplier-when-overriding-hashcode per una discussione sulle funzioni di hash. – posdef

+0

Ho registrato questo miglioramento. Vota per questo! https://bugs.eclipse.org/bugs/show_bug.cgi?id=424214 –

risposta

4

Nelle preferenze Eclipse andare in Java> Editor> Modelli.

Qui è possibile creare un nuovo modello. Il modello potrebbe essere simile:

@Override 
public int hashCode() 
{ 
    return Objects.hash(one, two, three, four/*, ...*/); 
} 

non sono sicuro se c'è una variabile che correttamente enumerare i campi però.

Si potrebbe desiderare di guardare some further explanations on these templates

+7

Sfortunatamente il sistema di template non supporta l'enumerazione dei campi (qualcosa di simile a ** $ {enclosing_method_arguments} **, potrebbe avere stato _ $ {enclosing_type_fields} _ se esisteva). Anche se si scrive un modello per generare automaticamente lo standard, sarà comunque necessario compilare manualmente i nomi dei campi all'interno del metodo 'hash()'.E non ho idea del motivo per cui il template hashCode ed equals non è elencato in _Java> Stile codice> Modelli codice _... – ADTC

2

C'è un nuovo plug-in disponibile in grado di generare metodi toString(), hashCode(), equals() usando Java 7 funzioni, biblioteca apache comune lang, biblioteca guava. Ha buone caratteristiche personalizzabili. Si prega di trovare il link sottostante per installare il plugin. Dopo l'installazione, basta fare clic destro -> Jenerate -> opzioni differenti

Il collegamento - https://marketplace.eclipse.org/content/jenerate

+0

Sfortunatamente, questo plugin ha un bug, non genera l'hashCode e uguaglia correttamente se hai una super classe. –