C'è qualche motivo giustificabile per usare new e un costruttore su una classe numerica in Java?

StackOverflow https://stackoverflow.com/questions/1009087

  •  06-07-2019
  •  | 
  •  

Domanda

C'è qualche motivo giustificabile in qualcosa di simile a Java

Long l = new Long(SOME_CONSTANT)

Questo crea un oggetto in più ed è taggato da FindBugs, ed è ovviamente una cattiva pratica. La mia domanda è se c'è mai una buona ragione per farlo?

In precedenza avevo chiesto questo riguardo ai costruttori di stringhe e ho ottenuto una buona risposta , ma quella risposta non sembra applicarsi ai numeri.

È stato utile?

Soluzione

Solo se vuoi assicurarti di ottenere un'istanza unica, quindi praticamente mai.

Alcuni numeri possono essere memorizzati nella cache quando vengono inseriti nella casella automatica (sebbene Longs non sono garantiti ), il che potrebbe causare problemi. Ma qualsiasi codice che potrebbe rompersi a causa della memorizzazione nella cache ha probabilmente problemi più profondi. In questo momento, non riesco a pensare a un singolo caso valido per questo.

Altri suggerimenti

  

La mia domanda è se c'è mai una buona ragione per farlo?

Potresti comunque usarlo se vuoi scrivere codice compatibile con JRE precedenti. valueOf (long) è stato introdotto solo in Java 1.5, quindi in Java 1.4 e prima che il costruttore fosse l'unico modo per passare direttamente da un lungo a un lungo . Mi aspetto che non sia deprecato perché il costruttore è ancora utilizzato internamente.

L'unica cosa che mi viene in mente è di rendere esplicito il boxing, sebbene il codice autoboxed equivalente sia effettivamente compilato in Long.valueOf (SOME_CONSTANT) che può memorizzare nella cache piccoli valori: (da jvm src)

   public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
    }
        return new Long(l);
  }

. Non è un grosso problema, ma non mi piace vedere il codice che riordina e scompone continuamente senza riguardo per il tipo, che può diventare sciatto.

Funzionalmente, però, non riesco a vedere una differenza in un modo o nell'altro. Il nuovo long verrà comunque calcolato come uguale e l'hashcode uguale a quello con la casella automatica, quindi non riesco a vedere come potresti anche fare una distinzione funzionale se lo desideri.

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