2015-04-24 11 views
10

Attraverso l'API Java si vedono numerose occorrenze di nomi e pratiche conflittuali che mi stanno davvero confondendo.Convenzioni Java per dati accessibili. (Accessors pubblici & Getter/Denominazione)

Ad esempio:

La classe String ha una variabile privata (Intero) con il nome di count che tiene traccia della dimensione della stringa, tuttavia questo viene restituito da un getter con il nome di length() .

Se si passa a qualsiasi tipo di array, invece di avere un metodo getter per la lunghezza, basta passare la variabile attraverso una pubblica accessor e può essere ottenuta tramite arrayInstance.length.

Tornando alla classe String abbiamo il metodo String#getBytes() che è un getter, simile al getter length(), tuttavia esegue un po 'più di logica per ottenere e restituire il valore.

A me, personalmente, la creazione di un getter con il prefisso di get sembra ridondante, per esempio io piuttosto digito GamePacket#data() contro GamePacket#getData() però mi sento come se ci può essere un significato più profondo alla base di questa denominazione invece di incoerenza.

Inoltre, perché lo Array[] non utilizza un getter per length?

Qualcuno sarebbe così gentile da far luce su questo per me?

+2

Un array non verrà ridimensionato. La 'lunghezza' è' finale' e innocua'. – ChiefTwoPencils

+0

@ChiefTwoPencils - Buono a notare, perso questo, +1. – Hobbyist

risposta

6

Getters (e setter) provengono da Java Specifica del fagiolo. Le ragioni per il loro utilizzo sono molteplici:

  • la maggior parte degli sviluppatori Java si aspettano di accesso per essere nominato come quello
  • un'API rispettando queste convenzioni è più facile da scoprire. Ad esempio, nel mio IDE, io spesso premo getCtrlSpazio per scoprire tutte le informazioni disponibili in un oggetto.
  • molte API e framework si basano su queste convenzioni a lavorare: il JSP EL, framework MVC che popolano i fagioli da parametri di richiesta, JPA, quadri iniezione di dipendenza come Spring, etc.

È solito nome il getter allo stesso modo come la variabile privata che contiene le informazioni, ma ciò che conta è l'incapsulamento e l'API pubblica, quindi nulla vi impedisce di calcolare un valore in un getter, o per nome il campo privato in un modo diverso.

+0

Mi dispiace, forse non sto leggendo la tua risposta correttamente, quindi è corretta la convenzione per usare 'getXXX()' apposed a 'XXX()' o non importa? – Hobbyist

+0

Sì, è una convenzione che la maggior parte degli sviluppatori rispetta, specialmente se c'è la possibilità che la loro classe sia utilizzata in un ambiente che si basa su queste convenzioni. –

0

convenzioni di denominazione sembrano variare in tutta la base di codice Java, ma quello standard iniziale era di denominazione JavaBeans convenzione; questo fondamentalmente formava una soluzione di nomenclatura alla mancanza di proprietà reali di Java.

Oggetto/getter primitive avevano la forma getXXX(), eccetto booleani, che aveva la forma preferita isXXX(). I setter erano sempre nella forma setXXX().

Da questo singolo punto sono state scritte milioni di righe di codice riflettente.

annotazioni

Questa convenzione pre-datati, che sarebbe stato un trade-off tra l'aumento intenti e una maggiore livello di dettaglio quando si scrive qualcosa di simile a questo codice pseudo-ish

@Setter 
void data(Data data) { 
    this.data = data; 
}; 

@Getter 
Data data() { 
    return data; 
}; 
1

Questa non sarà una risposta completa, poiché una risposta reale probabilmente richiederebbe un'intervista agli sviluppatori originali di Java o alla ricerca di documenti storici. Ma qui ci sono un paio di note:

  • Come v'è stato detto nei commenti, il campo di un array length è final, quindi non può essere impostato.
  • Entrambi gli array e la classe String sono stati progettati nelle prime versioni di Java, prima che le convenzioni per getter e setter fossero risolte. Le convenzioni get...is... e set... sono state risolte solo con l'introduzione di JavaBeans. La modifica dell'API renderebbe il vecchio codice smesso di funzionare e pertanto i vecchi nomi persistono.
  • In generale (ad esempio, classi che non sono JavaBeans), in realtà non esiste alcuna regola che indichi che i metodi getter e setter devono riflettere il nome di un particolare campo nella classe. L'intera idea dei metodi di accesso è che nascondono l'implementazione, quindi qualunque cosa ci sia dietro può essere un campo, una combinazione di campi o qualcos'altro.
Problemi correlati