Gli oggetti valore dovrebbero essere dichiarati non programmaticamente?

0

Se ho un tipico "oggetto valore" (oggetto di trasporto) ega classe Java con solo variabili di istanza e getter e setter, allora ho detto che voglio dichiararlo fuori da Java, come un Javabean in XML e lasciare che il contenitore generare la classe. Qual è il vantaggio? l'altro ragazzo ha chiesto. Posso pensare a diversi vantaggi ma voglio sapere cosa ne pensi? Se lo dichiariamo in XML è più come separare i dati dal codice, e penso che tutti quegli "oggetti valore" siano gli stessi, quindi non dovrebbero essere le loro classi quando non ci sono metodi oltre ai getter e setter iea tipici "JavaBean".

    
posta Niklas Rosencrantz 03.08.2016 - 19:42
fonte

1 risposta

3

No, non dovresti dichiararlo in XML, dovresti usare un processore di annotazione.

it is more like separating the data from the code

No, non lo è. Quello che stai proponendo è generare codice dai metadati. Se generi codice da dati, stai facendo parte di quel dato al tuo codice. È l'esatto opposto della separazione.

I think that all those "value objects" are the same

Sì. Tali classi tendono a essere molto ripetitive e fastidiose da scrivere e mantenere.

They should not be their own classes when there is no methods besides getters and setters

Cosa succede quando improvvisamente vuoi aggiungere un metodo in più? Sarà un po 'di lavoro fastidioso in più per convertirlo in una classe e quindi aggiungere il metodo. Oltre a questo, ora devi mantenere la classe manualmente.

Quindi cosa dovresti fare invece?

Un'opzione è FreeBuilder, link

Scrivi codice come questo:

@FreeBuilder
public abstract class Person {
   public abstract String getFirstName();
   public abstract String getLastName();
   public abstract Date getBirthDate();

   public String getFullName() {
      return getFirstName() + " " + getLastName();
   }

   public static class Builder extends Person_Builder {}

}

FreeBuilder genererà automaticamente il codice per hashCode, equals e un builder in modo che tu possa fare:

Person person = new Person.Builder()
   .setFirstName("Bill")
   .setLastName("Gates")
   .setBirthDate(birthDate)
   .build()

L'aggiunta di nuovi campi è probabilmente più semplice della modifica di XML. Gli IDE supportano nativamente i processori di annotazione in modo che lavorino naturalmente con loro. Posso facilmente aggiungere metodi che non sono campi senza perdere la capacità del processore di generare automaticamente la funzione mancante.

Nel mio progetto corrente, ho scritto il mio proprio processore di annotazione che mi consente di scrivere codice come:

@AutoBean
class Person extends PersonImpl {
    static class Fields {
        String first;
        String last;
        Date birthDate; 
    }
}

AutoBean crea PersonImpl che fornisce getter, setter e builder per tutti i miei campi. Ogni volta che desidero che tutti gli oggetti di valore abbiano una nuova funzione, posso aggiungerla all'implementazione AutoBean e tutti ce l'hanno.

Fondamentalmente, lo standard di riferimento per la creazione di oggetti di valore in Java dovrebbe essere evitato, ma XML non è un buon modo per farlo. Utilizza un processore di annotazioni, uno dei quali fornisce ciò di cui hai bisogno o esegui il rollover.

    
risposta data 03.08.2016 - 20:52
fonte

Leggi altre domande sui tag