2008-11-06 4 views

Antwort

35

BigDecimal.ZERO ist eine vordefinierte Konstante und muss daher nicht zur Laufzeit aus einer Zeichenfolge ausgewertet werden, wie BigDecimal("0") wäre. Es wird schneller und erfordert nicht die Erstellung eines neuen Objekts.

Wenn Ihr Code unter 1.5 ausgeführt werden muss, können Sie das (viel verfälschte) Singleton-Muster verwenden, um ein Objekt zu erstellen, das BigDecimal.ZERO entspricht. Wenn es zum ersten Mal verwendet wird, ruft es BigDecimal("0") auf, um ein Null-Objekt zu erstellen und dieses Objekt bei nachfolgenden Aufrufen zurückzugeben. Andernfalls, wenn Ihr Code auf einem 1.5-System ausgeführt wird, kann Ihr Singleton-Objekt einfach BigDecimal.ZERO ohne Laufzeitfehler zurückgeben.

+0

Ich würde das Wort "im Wesentlichen" entfernen - es ist eine vordefinierte Konstante. –

+0

Guter Anruf, danke. –

+1

new BigDecimal ("0") erstellt jedes Mal eine neue Objektinstanz, aber BigDecimal.ZERO erstellt keine neuen Instanzen. –

13

Die Verwendung von ZERO erstellt kein neues Objekt oder erfordert ein Parsing. Definitiv der Weg zu gehen.

3

Aus reiner Neugier habe ich den Konstruktor für BigDecimal überprüft und es gibt keine Optimierungen für die Zeichenfolge "0". Also definitiv ja, es gibt einen Unterschied.

+3

Es würde sowieso einen Unterschied geben, da das Aufrufen von BigDecimal ("0") jedes Mal ein neues Objekt erzeugt. –

+0

Kann das nicht bestreiten. Ich war nur neugierig zu wissen, wie groß eine Strafe ohne ZERO wäre. Stellt sich heraus, es ist wesentlich, da der Konstruktor für BigDecimal ziemlich schwer ist. –

4

Bevor Sie über Laufzeitabzüge sprechen, stellen Sie sicher, dass dieser Code wichtig ist. Richten Sie Profiling ein und messen Sie den kompletten Anwendungsfall.

Dennoch bevorzugen Bigdecimal.ZERO, wie es zur Kompilierzeit überprüft wird, während Sie versehentlich new BigDecimal("9") eingeben können, die der Compiler akzeptiert, aber die Fehler in Ihrer Anwendung verursachen wird.

+0

Sie könnten dies über eine beliebige Zahl sagen. –

+1

@RobertL: Ja, aber dies beseitigt dies für eine der Nummern, reduziert das Risiko um 1/10 :). Es hat auch keine Chance, eine 'NumberFormatException' zu werfen. – wchargin