Antworten:
Andere haben erwähnt, dass bestimmte Konstrukte wie Collections
Objekte erfordern und dass Objekte mehr Overhead haben als ihre primitiven Gegenstücke (Speicher & Boxen).
Eine weitere Überlegung ist:
Es kann nützlich sein, Objekte zu initialisieren null
oder null
Parameter an eine Methode / einen Konstruktor zu senden , um den Status oder die Funktion anzuzeigen. Dies ist mit Grundelementen nicht möglich.
Viele Programmierer initialisieren Zahlen mit 0 (Standard) oder -1, um dies anzuzeigen. Je nach Szenario kann dies jedoch falsch oder irreführend sein.
Dies wird auch die Szene für einen NullPointerException
Fall festlegen, in dem etwas falsch verwendet wird, was viel programmiererfreundlicher ist als ein beliebiger Fehler auf der ganzen Linie.
Im Allgemeinen sollten Sie primitive Typen verwenden, es sei denn, Sie benötigen aus irgendeinem Grund ein Objekt (z. B. zum Einfügen in eine Sammlung). Betrachten Sie auch dann einen anderen Ansatz, für den kein Objekt erforderlich ist, wenn Sie die numerische Leistung maximieren möchten. Dies wird in der Dokumentation empfohlen , und dieser Artikel zeigt, wie Auto-Boxing einen großen Leistungsunterschied verursachen kann.
Integer
ist besser lesbar als int
.
Wenn meine Klassenmitglieder Wrapper-Variablen sind, sind meiner Meinung nach keine Standardwerte erforderlich, was ein entwicklerfreundliches Verhalten ist.
1.
class Person {
int SSN ; // gets initialized to zero by default
}
2.
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
Im ersten Fall können Sie den SSN-Wert nicht uninitialisieren. Es kann weh tun, wenn Sie nicht überprüfen, ob der Wert festgelegt wurde, bevor Sie versuchen, ihn zu verwenden.
Im zweiten Fall können Sie die SSN mit null initialisieren. Dies kann zu NullPointerException führen, ist jedoch besser, als unwissentlich Standardwerte (Null) als SSN in die Datenbank einzufügen, wenn Sie versuchen, diese zu verwenden, ohne das SSN-Feld zu initialisieren.
PersonBuilder
eine Ausnahme ausgelöst, wenn die SSN nicht festgelegt wurde, bevor "build" aufgerufen wird, um die Person
Instanz abzurufen. Ich denke, diese Art von Dingen ist übertrieben, aber es ist das, was die Java-Sprache für richtige Muster fördert.
Ich würde die Wrapper-Typen nur verwenden, wenn Sie müssen.
Wenn Sie sie verwenden, gewinnen Sie nicht viel, abgesehen von der Tatsache, dass sie es sind Objects
.
Und Sie verlieren Overhead bei der Speichernutzung und der Zeit, die Sie für das Boxen / Entpacken aufgewendet haben.
Praktisch war ich auf eine Situation gestoßen, in der die Verwendung der Wrapper-Klasse erklärt werden kann.
Ich habe eine Serviceklasse erstellt, die eine long
Typvariablen erstellt
long
- wenn sie nicht initialisiert wird, wird sie auf 0 gesetzt -, ist dies für den Benutzer verwirrend, wenn sie in der GUI angezeigt wird Long
- wenn sie nicht initialisiert ist, wird sie auf gesetztnull
- wird dieser Nullwert nicht in der GUI angezeigt.Dies gilt Boolean
auch dann, wenn Werte bei Verwendung von Grundelementen verwirrender sein können boolean
(da der Standardwert false ist).
Sammlungen sind der typische Fall für einfache Java-Wrapper-Objekte. Sie können dem Wrapper jedoch eine spezifischere Bedeutung im Code (Wertobjekt) geben.
IMHO gibt es fast immer einen Vorteil, Wertobjekte zu verwenden, wenn es um Lesbarkeit und Pflege des Codes geht. Das Umschließen einfacher Datenstrukturen in Objekte, wenn sie bestimmte Verantwortlichkeiten haben, vereinfacht häufig den Code. Dies ist im domänengesteuerten Design sehr wichtig .
Es gibt natürlich das Leistungsproblem, aber ich neige dazu, dies zu ignorieren, bis ich die Möglichkeit habe, die Leistung mit geeigneten Daten zu messen und gezielter auf den Problembereich zu reagieren. Es ist möglicherweise auch einfacher, das Leistungsproblem zu verstehen, wenn der Code ebenfalls leicht zu verstehen ist.
Die Leistung von Anwendungen, die von numerischen Berechnungen dominiert werden, kann von der Verwendung von Grundelementen stark profitieren.
Bei primitiven Typen wird der Operator == verwendet. Für den Wrapper wird jedoch bevorzugt die Methode equals () aufgerufen.
"Primitive Typen gelten als schädlich", weil sie "prozedurale Semantik" zu einem ansonsten einheitlichen objektorientierten Modell mischen.
Viele Programmierer initialisieren Zahlen mit 0 (Standard) oder -1, um dies anzuzeigen. Je nach Szenario kann dies jedoch falsch oder irreführend sein.
Wenn Sie Sammlungen verwenden möchten, müssen Sie Wrapper-Klassen verwenden.
Primitive Typen werden für Arrays verwendet. Außerdem, um Daten darzustellen, die kein Verhalten haben, z. B. einen Zähler oder eine boolesche Bedingung.
Seit dem Autoboxing ist die Grenze, wann Primitive oder Wrapper verwendet werden sollen, ziemlich verschwommen.
Denken Sie jedoch daran, dass Wrapper Objekte sind, sodass Sie alle ausgefallenen Java-Funktionen erhalten. Sie können beispielsweise Reflexion verwenden, um ganzzahlige Objekte zu erstellen, jedoch keine int-Werte. Wrapper-Klassen haben auch Methoden wie valueOf.
Wenn Sie einen Werttyp erstellen möchten. So etwas wie eine ProductSKU oder ein AirportCode.
Wenn ein primitiver Typ (Zeichenfolge in meinen Beispielen) Gleichheit definiert, möchten Sie Gleichheit überschreiben.
Primitive Werte in Java sind kein Objekt. Um diese Werte als Objekt zu bearbeiten, stellt das Paket java.lang eine Wrapper-Klasse für jeden der primitiven Datentypen bereit.
Alle Wrapper-Klassen sind endgültig. Das Objekt aller Wrapper-Klassen, die initiiert werden können, ist unveränderlich. Dies bedeutet, dass der Wert im Wrapper-Objekt nicht geändert werden kann.
Die void- Klasse wird zwar als Wrapper-Klasse betrachtet, umschließt jedoch keine primitiven Werte und ist nicht initiierbar. Es gibt keinen öffentlichen Konstruktor, sondern nur ein Klassenobjekt, das das Schlüsselwort void darstellt.