2011-10-01 12 views
14

Volevo sapere se qualcuno conosce un buon metodo per aggiornare, costruttori, uguali, hash, stringhe, ecc. Generato da eclipse in Java. Lotto di tempo, dopo che utilizzo gli stub di codice generati automaticamente, aggiungo una variabile membro alla classe, quindi ho bisogno di eliminare il codice generato automaticamente e di rifarlo tutto da capo. C'è un modo per far sì che eclissi aggiunga la nuova variabile agli stub di codice generati automaticamente?come aggiornare i costruttori Java, equals, hash, ecc. in eclissi?

modifica: ok la cancellazione non è essenziale, tuttavia devo ancora andare a generarne ognuna, sto cercando una soluzione automatica.

+0

Penso che sia molto più importante averlo corretto rispetto al generato automaticamente. La risposta Apache HashCode è la strada da percorrere. – JohnKlehm

risposta

4

Date un'occhiata su www.projectlombok.org come alternativa alla scrittura di questi metodi. In particolare, l'annotazione @Data sembra adattarsi alle tue necessità, vedere http://www.projectlombok.org/features/Data.html.

+0

Questo è bello. ma ha un inconveniente. quando si fa riferimento a insiemi, ottiene, ecc. da un'altra classe, eclipse non saprà come eseguire il completamento automatico (utilizzando CTRL + SPAZIO) perché questi metodi vengono generati al volo ... – stdcall

+1

In realtà anche la funzione di completamento automatico funziona, controllare i documenti. – Kevin

+0

interessante, lo controllerò – stdcall

2

Iv'e ha creato un mio progetto con un campo e ha chiesto a Eclipse di generare tutti i metodi di base. Dopo che ho aggiunto un nuovo campo, ho chiesto di generare nuovamente questi metodi (source -> generate ...), mi ha suggerito di sostituire quelli vecchi, ho cliccato su "sì" e sono stati visualizzati i metodi aggiornati.

Speranza ha aiutato

+0

Non ha funzionato. Voglio che venga aggiornato automaticamente o con un pulsante. come hai detto, devo fare tutto da capo per tutti gli stub – stdcall

6

Questo non è esattamente una soluzione alla tua domanda, ma io uso più i metodi di auto-generate Eclipse, io uso il Apache commons langEqualsBuilder e HashCodeBuilder:

Così, per esempio si può fare:

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

Questo usa il riflesso e non ha bisogno di modifiche quando si aggiunge un campo. Tuttavia, esistono altre opzioni in cui è possibile specificare i campi da utilizzare e se si desidera prendere in considerazione anche l'hashCode della superclasse.

MODIFICA: Come è stato sottolineato, l'aspetto di riflessione di questo può avere alcune penalità di prestazioni associate. Personalmente, non uso la riflessione HashCodeBuilder o EqualsBuilder nel codice di produzione, io uso il toHashCode (come sotto). Io comunque uso il ReflectionToStringBuilder per la registrazione e simili.

Ecco un esempio che non fa uso di riflessione, ma si richiede di aggiungere un'altra linea quando si aggiunge un campo:

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

Per ulteriori discussione su hashCodeBuilder, vedere apache commons equals/hashcode builder

+0

Yowzers, scommetto che * è * performante! :) –

+0

Se si tratta di oggetti immutabili, che di solito cerco di fare, è possibile memorizzare nella cache i valori di toString e hashCode che potrebbero essere di grande aiuto. – ArtB

+0

@Ernest In realtà non è male, dipende da quello che stai facendo. I vantaggi di non dover generare il proprio hashCode() e l'uso di uno standard e soprattutto di un hashCode corretto superano qualsiasi piccolo problema di prestazioni. –