2009-06-17 9 views
2

Gibt es einen berechtigten Grund in Java so etwas wieGibt es einen berechtigten Grund, new und einen Konstruktor für eine Zahlenklasse in Java zu verwenden?

Long l = new Long(SOME_CONSTANT) 

Dies schafft ein zusätzliches Objekt und wird von FindBugs markiert, und ist offensichtlich eine schlechte Praxis. Meine Frage ist, ob es jemals einen guten Grund dafür gibt?

Ich zuvor asked this about String constructors and got a good answer, aber diese Antwort scheint nicht auf Zahlen zutreffen.

Antwort

5

Nur wenn Sie sicherstellen möchten, dass Sie eine eindeutige Instanz erhalten, so praktisch nie.

Einige Nummern können im Cache gespeichert werden (obwohl Longs aren't guaranteed to be), was zu Problemen führen kann. Aber jeder Code, der aufgrund von Caching bricht, hat wahrscheinlich tiefere Probleme. Im Moment kann ich mir keinen einzigen gültigen Fall vorstellen.

1

Das einzige, was ich denken kann, ist die Box explizit zu machen, obwohl das Äquivalent autoboxed Code tatsächlich in Long.valueOf kompiliert wird (SOME_CONSTANT), die kleine Werte zwischenspeichern können: (von 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); 
    } 

. Keine große Sache, aber ich mag es nicht, Code zu sehen, der fortwährend ein- und ausgeht, ohne Rücksicht auf den Typ, der schlampig werden kann.

Funktionell kann ich jedoch keinen Unterschied auf die eine oder andere Weise sehen. Das neue long wird immer noch als gleichwertig berechnet und der Hashcode entspricht dem autoboxed, so dass ich nicht sehen kann, wie man eine funktionale Unterscheidung machen könnte, wenn man möchte.

4

Meine Frage ist, ob es jemals einen guten Grund dafür gibt?

Sie können es immer noch verwenden, wenn Sie Code schreiben möchten, der mit älteren JREs kompatibel ist. valueOf(long) wurde erst in Java 1.5 eingeführt, also in Java 1.4 und vor dem Konstruktor war der einzige Weg, direkt von einem langen zu einem langen zu gelangen. Ich erwarte, dass es nicht veraltet ist, weil der Konstruktor immer noch intern verwendet wird.

+0

Das ist in der Tat ein guter Grund (obwohl, wie viel Prozent der Java-Anwendungen immer noch auf 1.4 oder niedriger sind?). –

+0

Alte Plattformen können lange leben, besonders im Unternehmen. Als Java 6 herauskam, zielte ich auf eine Java 1.3-Plattform ab. – McDowell

+0

Ich war mir dessen nicht bewusst. Ich habe mich gefragt, warum ich es im Legacy-Code sah. – Uri