lunedì 5 gennaio 2015

Tre metodi comuni generati in tre Java IDE

In questo post, guardo le differenze nei tre metodi "comuni" [ equals (Object) ,  hashCode () e  toString () ] come generato da  NetBeans  8.0.2 ,  IntelliJ IDEA  14.0.2 , e  Eclipse  Luna  4.4.1 . L'obiettivo non è quello di stabilire quale sia il migliore, ma per mostrare i diversi approcci si possono utilizzare per l'attuazione di questi metodi comuni. Lungo il percorso, alcuni spunti interessanti potranno essere ritirati quanto riguarda la creazione di questi metodi comuni in base a ciò IDE assumere e spingono lo sviluppatore per impostare.

NetBeans 8.0.2


NetBeans 8.0.2 permette alle proprietà del progetto per essere configurato per supportare la piattaforma JDK 8 e aspettarsi JDK 8 formattazione originale, come illustrato nei prossimi due fotografie istantanee dello schermo.


Codice viene generato in NetBeans 8.0.2 cliccando su Fonte | Codice Inserisci (o sequenze di tasti Alt + Insert).


Quando si genera i metodi  Equals (Object) ,  hashCode () e  toString () , NetBeans 8.0.2 chiede per gli attributi da utilizzare in ciascuno di questi metodi generati come illustrato nei prossimi due fotografie istantanee dello schermo.


I metodi di NetBeans-generati approfittare del  JDK 7-introdotto  oggetti  di classe.

NetBeans generati hashCode () Metodo per la classe NetBeans802GeneratedCommonMethods.java

Override
public int hashCode ()
{
   int hash = 5;
   hash = 29 * hash + Objects.hashCode (this.someString);
   hash = 29 * hash + Objects.hashCode (this.timeUnit);
   hash = 29 * hash + this.integer;
   hash = 29 * hash + Objects.hashCode (this.longValue);
   ritorno hash;
}
NetBeans generate equals (Object) Metodo di Classe NetBeans802GeneratedCommonMethods.java

Override
boolean pubblico Equals (Object obj)
{
   if (obj == null)
   {
      return false;
   }
   if (getClass ()! = obj.getClass ())
   {
      return false;
   }
   NetBeans802GeneratedCommonMethods finali altro = (NetBeans802GeneratedCommonMethods) obj;
   if (! Objects.equals (this.someString, other.someString))
   {
      return false;
   }
   if (this.timeUnit! = other.timeUnit)
   {
      return false;
   }
   if (this.integer! = other.integer)
   {
      return false;
   }
   if (! Objects.equals (this.longValue, other.longValue))
   {
      return false;
   }
   return true;
}
NetBeans-Generated toString () metodo per la classe NetBeans802GeneratedCommonMethods.java

Override
public String toString ()
{
   ritorno "NetBeans802GeneratedCommonMethods {" + "someString =" + someString + ", TIMEUNIT =" + TIMEUNIT + ", integer =" + intero + ", longValue =" + longValue + '}';
}
Alcune osservazioni possono essere fatte per quanto riguarda i metodi comuni NetBeans-generati:

Tutto il codice generato è automatico e non supporta personalizzazione con l'eccezione dei campi utilizzati nei metodi quali l'operatore seleziona.
Tutti questi metodi comuni che si estendono controparti in  oggetto  classe hanno automaticamente il  Override  annotazioni fornito.
Nessuna documentazione Javadoc è incluso per metodi generati.
I metodi utilizzano la  oggetti  classe per rendere il codice generato più conciso con meno necessità di controlli nulli.
Solo un formato è supportato per la stringa generata da  toString ()  e che il formato di uscita è una sola linea delimitato da virgole.
Non ho mostro nell'esempio precedente, ma i metodi di generazione di NetBeans 8.0.2 non trattare array diverso rispetto riferimenti, enumerazioni, e primitive in alcuni casi:
Il generato  toString ()  attribuisce metodo tratta gamma dell'istanza come si tratta attributi altra istanza: si basa sul dell'array  toString () , che porta a risultati spesso indesiderati e in genere inutili (della matrice  identità sistema di codice hash ). Sarebbe generalmente preferibile avere il contenuto della stringa di attributi di matrice forniti da Arrays.toString (Object [])  o versione di overload equivalente o Arrays.deepToString (Object []) .
Il generato  hashCode ()  metodo utilizza  Arrays.deepHashCode (Object [])  per la gestione dei codici hash array.
Il generati  equals (Object)  metodo utilizza  Arrays.deepEquals (Object [], Object []) per la gestione dei controlli di uguaglianza array.
Vale la pena di sottolineare qui che NetBeans utilizza le versioni "profonde" degli  array metodi per confrontare le matrici per l'uguaglianza e informatica codici hash array 'mentre IntelliJ IDEA e Eclipse utilizzano le versioni normali (non profondo) di  Array  metodi per confrontare le matrici per l'uguaglianza e la codici hash array di calcolo ".
IntelliJ IDEA 14.0.2

Per questi esempi, sto usando IntelliJ IDEA 14.0.2  Community Edition .


IntelliJ IDEA 14.0.2 fornisce la possibilità di configurare la struttura del progetto di aspettarsi un "livello di lingua" di JDK 8.


Per generare il codice in IntelliJ IDEA 14.0.2, si usa il Codice | Opzioni Generare (o le battute di tastiera Alt + Inserire come NetBeans).


IntelliJ IDEA 14.0.2 chiede all'operatore quali attributi da includere nei metodi generati. Chiede inoltre che i campi sono non-null, significato che i campi vengono considerati mai nulla. Nel snapshot qui illustrato, sono controllati, che porterebbe a metodi non controllare gli attributi per nulla prima di tentare di accedervi. Nel codice che ho generato con IntelliJ IDEA per questo post, però, io non sono quelli controllati, il che significa che IntelliJ IDEA controllerà per nulla prima di accedere nei metodi generati.


IntelliJ IDEA 14.0.2  toString ()  generazione offre una lunga lista di formati (modelli) per la generato () toString  metodo.


IntelliJ IDEA 14.0.2 permette anche all'operatore di selezionare gli attributi da includere nel generato toString ()  metodo (selezionato quando sfondo evidenziato è blu).


Pari IDEA-Generated (Object) Metodo di Classe Idea1402GeneratedCommonMethods.java

boolean pubblico Equals (Object o)
{
   se (questo == o) return true;
   if (! o == null || getClass () = o.getClass ()) return false;

   Idea1402GeneratedCommonMethods che = (Idea1402GeneratedCommonMethods) o;

   if (integer = that.integer!) return false;
   if (!?! = null longValue longValue.equals (that.longValue):! that.longValue = null) return false;
   if (!?! = null someString someString.equals (that.someString):! that.someString = null) return false;
   if (TIMEUNIT = that.timeUnit!) return false;

   return true;
}
HashCode IDEA-Generated () Metodo di Classe Idea1402GeneratedCommonMethods.java

Override
public int hashCode ()
{
   int result = someString! = null? someString.hashCode (): 0;
   risultato = 31 * risultato + (TIMEUNIT = null timeUnit.hashCode ():!? 0);
   risultato = 31 * risultato + intero;
   risultato = 31 * risultato + (= null longValue.hashCode () longValue:?! 0);
   risultato ritorno;
}
ToString IDEA-Generated () Metodo di Classe Idea1402GeneratedCommonMethods.java

Override
public String toString ()
{
   ritorno "Idea1402GeneratedCommonMethods {" +
      "SomeString = '" + someString +' \ '' +
      ", TIMEUNIT =" + TIMEUNIT +
      "Integer =" + intero +
      ", LongValue =" + longValue +
      '}';
}
Alcune osservazioni possono essere fatte per quanto riguarda i metodi comuni IntelliJ IDEA-generated:

La maggior parte del codice generato è automatica con minore personalizzazione disponibili tra cui i campi utilizzati nei metodi che le seleziona operatore, indicazione di quali settori sono tenuti a essere non nullo (in modo che i controlli nulli non sono necessari in codice generato), e la possibilità di selezionare uno degli otto incorporato  toString ()  formati.
Tutti questi metodi comuni che si estendono controparti in  oggetto  classe hanno automaticamente il  Override  annotazioni fornito.
Nessuna documentazione Javadoc è incluso per metodi generati.
I metodi generati non fanno uso di  oggetti  di classe e lo richiedano controlli espliciti per nulla per tutti i riferimenti che potrebbero essere nullo.
Non è mostrato nell'esempio precedente, ma IntelliJ IDEA 14.0.2 fa trattare array differente nella generazione di questi tre metodi comuni:
Generated  toString ()  metodo utilizza  Arrays.toString (Array)  sulla matrice.
Generated  hashCode ()  metodo utilizza  Arrays.hashCode (Object [])  (o versione di overload) sulla matrice.
Generati  equals (Object)  metodo utilizza  Arrays.equals (Object [], Object [])  (o versione di overload) sulla matrice.
Eclipse 4.4.1 Luna


Eclipse Luna 4.4.1 permette il Java Compiler in Proprietà del progetto per essere impostato su JDK 8.


In Eclipse Luna, lo sviluppatore utilizza la "Sorgente" a discesa per selezionare il tipo specifico di generazione di codice sorgente da eseguire.


Eclipse Luna permette all'operatore di selezionare gli attributi da includere nei metodi comuni. Inoltre permette all'operatore di specificare alcune caratteristiche dei metodi generati. Ad esempio, l'operatore può scegliere di avere gli elementi di un array stampata individualmente in generato  toString ()  metodo piuttosto che un nome di classe spesso prive di significato e di identità sistema di codice hash presentato.


Eclipse-Generated hashCode () Metodo per la classe Eclipse441GeneratedCommonMethods.java

/ * (Non Javadoc)
 *see Java.lang.Object # hashCode ()
 * /
Override
public int hashCode ()
{
   finale int prime = 31;
   int result = 1;
   risultato = prime * risultato + this.integer;
   risultato = risultato primo *
         + ((This.longValue == null) 0:? This.longValue.hashCode ());
   risultato = risultato primo *
         + ((This.someString == null) 0:? This.someString.hashCode ());
   risultato = risultato primo *
         + ((This.timeUnit == null) 0:? This.timeUnit.hashCode ()); risultato ritorno;
}
Pari Eclipse-generati (Object) Metodo di Classe Eclipse441GeneratedCommonMethods.java

/ * (Non Javadoc)
 *see java.lang.Object # equals (java.lang.Object)
 * /
Override
boolean pubblico Equals (Object obj)
{
   se (questo == obj)
      return true;
   if (obj == null)
      return false;
   if (getClass ()! = obj.getClass ())
      return false;
   Eclipse441GeneratedCommonMethods altro = (Eclipse441GeneratedCommonMethods) obj;
   if (this.integer! = other.integer)
      return false;
   if (this.longValue == null)
   {
      if (other.longValue! = null)
         return false;
   } Else if (! This.longValue.equals (other.longValue))
     return false;
   if (this.someString == null)
   {
      if (other.someString! = null)
         return false;
   } Else if (! This.someString.equals (other.someString))
      return false;
   if (this.timeUnit! = other.timeUnit)
      return false;
   return true;
}
Eclipse-Generated toString () metodo per la classe Eclipse441GeneratedCommonMethods.java

/ * (Non Javadoc)
 *see java.lang.Object # equals (java.lang.Object)
 * /
Override
boolean pubblico Equals (Object obj)
{
   se (questo == obj)
      return true;
   if (obj == null)
      return false;
   if (getClass ()! = obj.getClass ())
      return false;
   Eclipse441GeneratedCommonMethods altro = (Eclipse441GeneratedCommonMethods) obj;
   if (this.integer! = other.integer)
      return false;
   if (this.longValue == null)
   {
      if (other.longValue! = null)
         return false;
   } Else if (! This.longValue.equals (other.longValue))
     return false;
   if (this.someString == null)
   {
      if (other.someString! = null)
         return false;
   } Else if (! This.someString.equals (other.someString))
      return false;
   if (this.timeUnit! = other.timeUnit)
      return false;
   return true;
}
Alcune osservazioni possono essere fatte per quanto riguarda i metodi comuni Eclipse-generated:

Eclipse fornisce il maggior numero di punti del processo di generazione in cui l'output generato è configurabile. Ecco alcune delle opzioni configurabili:
Posizione in classe (prima o dopo i metodi di classe esistenti) può essere specificato esplicitamente.
Tutti questi metodi comuni che si estendono controparti in  oggetto  classe hanno automaticamente il  Override  annotazioni fornito.
"Metodo commenti" possono essere generati, ma non sono i commenti di stile Javadoc (uso / *  invece di  / **  ed esplicitamente dichiarano che non sono commenti Javadoc come parte del commento generato).
Opzione a "elenca il contenuto di array invece di utilizzare toString native ()" consente allo sviluppatore di avere Arrays.toString (Array) essere usato (come per l'approccio di IntelliJ IDEA e si verifica se selezionato) o che hanno il sistema di individuare il codice hash da utilizzare (stesso L'approccio di NetBeans e si verifica se non selezionata).
Supporto per quattro  toString ()  stili più possibilità di specificare lo stile personalizzato.
Possibilità di limitare il numero di voci di un array, di raccolta, o mappa che viene stampato in toString () .
Possibilità di utilizzare un'istanza di in generati  equals (Object)  implementazione.
Tutti questi metodi comuni che si estendono controparti in  oggetto  classe hanno automaticamente il  Override  annotazioni fornito.
I metodi generati non fanno uso di  oggetti  di classe e lo richiedano controlli espliciti per nulla per tutti i riferimenti che potrebbero essere nullo.
Eclipse 4.4.1 Luna fa il trattamento di matrici in modo diverso quando generano i tre metodi comuni evidenziati in questo post:
Generated  toString ()  utilizza opzionalmente  Arrays.toString (Object [])  o la versione di overload per accedere ai contenuti di array.
Generati  equals (Object)  utilizza  Arrays.equals (Object [], Object [])  o la versione sovraccarico per confrontare le matrici per l'uguaglianza.
Generated  hashCode ()  utilizza  Arrays.hashCode (Object [])  o la versione di overload per il calcolo del codice hash di array.
Conclusione

Tutti e tre IDE trattati in questo post (NetBeans, IntelliJ IDEA, e Eclipse) generano implementazioni sonore dei metodi comuni  Equals (Object) ,  hashCode () e  toString () , ma ci sono differenze tra la personalizzazione di questi metodi generati in tutto il tre IDE. Le diverse personalizzazioni che sono disponibili e le diverse implementazioni che vengono generati in grado di fornire agli sviluppatori nuove lezioni di Java per conoscere e prendere in considerazione in sede di attuazione di questi metodi. Mentre il vantaggio più evidente e significativa di queste capacità IDE di generare questi metodi è il risparmio di tempo associati con questa generazione automatica, altri vantaggi di generazione IDE di questi metodi includono la capacità di conoscere l'attuazione di tali metodi e la maggiore probabilità di implementazioni di successo senza errori di battitura o altri errori.

Pubblicato il DZone con il permesso di Dustin Marx , autore e DZone MVB. ( fonte )

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.