Domanda

C'è qualche motivo per usare Integer.valueOf (X) per inizializzare un intero finale, come di seguito:

public class MyClass
{
  public static final Integer DAY_1 = Integer.valueOf(1); // Why do it this way?
  public static final Integer DAY_2 = 2; // When it can be done this way?
}

ho capito che questo era necessario nelle versioni precedenti di Java prima è stato aggiunto autoboxing. C'è qualche ragione di questo tipo di codice rimane? O è solo una cattiva abitudine?

È stato utile?

Soluzione

  • C'è un sacco di codice scritto prima di 1,5 è venuto fuori. Non c'è bisogno di aggiornare il tutto senza portare alcun beneficio.
  • In alcuni casi lo rende più chiaro che si è di pugilato. Nel caso hai dato si può facilmente vedere il tipo di destinazione sulla stessa linea - ma non è sempre il caso
  • .
  • Se si desidera chiamare un metodo che ha sovraccarichi sia per Integer e int e si desidera chiamare sovraccarico Integer, questo è un modo semplice per farlo.

Altri suggerimenti

Un programmatore potrebbe scegliere di scrivere in questo modo per sottolineare visivamente che DAY_1 è un numero intero (oggetto), non è un int.

Non sto dicendo che io lo consiglio, ma potevo immaginare che qualcuno l'assunzione di questo approccio per quel motivo.

Oltre alle ragioni di Jon, alcune persone semplicemente non come auto (ONU) di pugilato, punto. Ci sono molte sfumature ad esso che alcune persone scelgono di evitare categoricamente di vietare il suo utilizzo in generale a causa di errori di compilazione o avvisi opzionali (Eclipse li può trasformarsi in errori o avvisi, per es.)

Se questo è il caso, non c'è molta scelta oltre ad utilizzare il primo, anche in casi come questo in cui non è davvero guadagnando molto.

Per quanto riguarda il compilatore è interessato, non c'è differenza (anche se si dovrebbe fare attenzione nel caso di argomenti sovraccarico). Sotto il cofano, la forma illustrata per DAY_2 viene semplicemente convertito nella forma usata per DAY_1 dal compilatore.

Per gli esseri umani, ci potrebbe essere una differenza. Io di solito evito automatico (ONU) di pugilato come un atto di programmazione difensiva, perché sento che la pratica rende troppo facile per me dimenticare il caso nullo. Ma in realtà, tocca a voi.

Autoboxing può portare a bug molto sottili che possono essere molto difficile da trovare. A causa di questo, alcuni IDE hanno la capacità di generare un avviso quando si utilizza qualsiasi tipo di boxe / unboxing. Se si vuole mettere a tacere questa opzione avvertimenti 1 lo farà per voi.

Così, alla fine, tutto si riduce alle preferenze personali e gli standard di codifica del progetto.

In questo caso particolare, non v'è alcun pericolo per l'utilizzo di autoboxing.

Integer.valueOf (1) consente la memorizzazione nella cache di valori comuni; per i valori da -128 a 128, essa ritorna sempre lo stesso oggetto per esempio, mentre new Integer (1) restituirà sempre un nuovo oggetto. Direi che è buona norma utilizzare questo per tutti i tipi di numero derivato (Integer, Long, BigDecimal, ecc), anche se questo è probabilmente quello che autoboxing sta facendo sotto le coperte in ogni caso.

Bart van Heukelom, la differenza tra list.remove (1) e list.remove (new Integer (1)) è questo; list.remove (1) rimuoverà l'oggetto di indice 1 dall'elenco, list.remove (new Integer (1)) rimuoverà tutti gli oggetti nell'elenco che sono uguali all'oggetto intero con un valore di uno. Ricordate che le collezioni non può immagazzinare primitive, solo gli oggetti.

E 'una cattiva abitudine e non c'è alcuna ragione per farlo in quanto la compilazione genererà il Integer.valueOf() per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top