La pratica standard è di andare con i primitivi, a meno che tu non abbia a che fare con i generici (assicurati di essere a conoscenza di autoboxing & unboxing !).
Ci sono una serie di buoni motivi per seguire la convenzione:
1. Evita errori semplici:
Ci sono alcuni casi sottili e non intuitivi che spesso catturano i principianti. Anche i codificatori esperti si sbagliano e fanno questi errori qualche volta (si spera che questo sia seguito da un errore quando eseguono il debug del codice e trovano l'errore!).
L'errore più comune è l'utilizzo di a == b
anziché a.equals(b)
. Le persone sono abituate a fare a == b
con le primitive, quindi è facile farlo quando usi i wrapper di oggetti.
Integer a = new Integer(2);
Integer b = new Integer(2);
if (a == b) { // Should be a.equals(b)
// This never gets executed.
}
Integer c = Integer.valueOf(2);
Integer d = Integer.valueOf(2);
if (c == d) { // Should be a.equals(b), but happens to work with these particular values!
// This will get executed
}
Integer e = 1000;
Integer f = 1000;
if (e == f) { // Should be a.equals(b)
// Whether this gets executed depends on which compiler you use!
}
2. Leggibilità:
Considera i seguenti due esempi. La maggior parte delle persone direbbe che il secondo è più leggibile.
Integer a = 2;
Integer b = 2;
if (!a.equals(b)) {
// ...
}
int c = 2;
int d = 2;
if (c != d) {
// ...
}
3. Performance:
Il fatto è che è più lento usare i wrapper Object per le primitive piuttosto che usare solo le primitive. Stai aggiungendo il costo di creazione di istanze di oggetti, chiamate di metodi, ecc. A cose che usi ovunque sul posto .
Knuth "... diciamo circa il 97% delle volte: l'ottimizzazione prematura è la radice di tutti i mali" la citazione non si applica proprio qui. Stava parlando di ottimizzazioni che rendono il codice (o il sistema) più complicato - se sei d'accordo con il punto 2, questa è un'ottimizzazione che rende il codice meno complicato!
4. È la convenzione:
Se fai scelte stilistiche diverse al 99% degli altri programmatori Java, ci sono 2 aspetti negativi:
- Troverai il codice di altre persone più difficile da leggere. Il 99% degli esempi / tutorial / etc là fuori useranno le primitive. Ogni volta che ne leggi uno, avrai il sovraccarico cognitivo in più di pensare a come apparirebbe nello stile a cui sei abituato.
- Altre persone troveranno il tuo codice più difficile da leggere. Ogni volta che fai domande su Stack Overflow, devi passare attraverso risposte / commenti che chiedono "perché non usi le primitive?". Se non mi credi, guarda le battaglie che le persone hanno su cose come il posizionamento delle parentesi, che non influisce nemmeno sul codice generato!
Normalmente vorrei elencare alcuni contro-punti, ma onestamente non riesco a pensare a nessuna buona ragione per non andare con la convenzione qui!