wake-up-neo.net

Wann werden Wrapper-Klasse und primitiver Typ verwendet?

Wann sollte ich mich für die Wrapper-Klasse über primitive Typen entscheiden? Oder unter welchen Umständen sollte ich zwischen Wrapper/Primitive-Typen wählen?

75
Gopi

Andere haben erwähnt, dass bestimmte Konstrukte wie Collections Objekte erfordern und dass Objekte mehr Aufwand haben als ihre primitiven Pendants (Speicher & Boxen).

Eine weitere Überlegung ist:

Es kann praktisch sein, Objekte mit null zu initialisieren oder null-Parameter in eine Methode/einen Konstruktor zu senden, um den Status oder die Funktion anzuzeigen. Dies ist nicht mit Primitiven möglich.

Viele Programmierer initialisieren Zahlen auf 0 (Standard) oder -1, um dies anzuzeigen. Dies kann jedoch je nach Szenario falsch oder irreführend sein.

Dies setzt auch die Szene für eine NullPointerException, wenn etwas falsch verwendet wird, was viel programmierfreundlicher ist als ein beliebiger Fehler auf der ganzen Linie.

56
pstanton

Im Allgemeinen sollten Sie primitive Typen verwenden, es sei denn, Sie benötigen ein Objekt aus irgendeinem Grund (z. B. um es in eine Sammlung aufzunehmen). Betrachten Sie auch dann einen anderen Ansatz, der kein Objekt erfordert, wenn Sie die numerische Leistung maximieren möchten. Dies wird in der Dokumentation und diesem Artikel erläutert, wie Auto-Boxing einen großen Leistungsunterschied verursachen kann.

15

Wenn meine Klassenmitglieder Wrapper-Variablen sind, sind meiner Meinung nach keine Standardwerte erforderlich. Dies ist ein benutzerfreundliches Verhalten.

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 uninitialisiert lassen. Es kann weh tun, wenn Sie nicht prüfen, ob der Wert festgelegt wurde, bevor Sie ihn verwenden. 

Im zweiten Fall können Sie SSN mit null initialisieren. Dies kann zu NullPointerException führen, ist jedoch besser als das unbewusste Einfügen von Standardwerten (Null) als SSN in die Datenbank, wenn Sie versuchen, sie ohne Initialisierung des SSN-Felds zu verwenden.

7
Cody

Ich würde nur die Wrapper-Typen verwenden, wenn Sie müssen.

Wenn Sie sie verwenden, gewinnen Sie nicht viel, außer dass sie Objects sind.

Und Sie verlieren den Overhead bei der Speichernutzung und die Zeit, die Sie beim Boxen/Unboxing verbringen.

6
jjnguy

Sammlungen sind der typische Fall für einfache Java-Wrapper-Objekte. Sie können jedoch in Betracht ziehen, dem Wrapper eine spezifischere Bedeutung im Code (Wertobjekt) zu geben.

IMHO ist es fast immer ein Vorteil, Wertobjekte zu verwenden, wenn es auf Lesbarkeit und Pflege des Codes ankommt. Das Einschließen einfacher Datenstrukturen in Objekte, wenn sie bestimmte Verantwortlichkeiten haben, vereinfacht häufig den Code. Dies ist etwas, das in Domain-Driven Design sehr wichtig ist. 

Natürlich gibt es das Leistungsproblem, aber ich neige dazu, das zu ignorieren, bis ich die Möglichkeit habe, die Leistung mit geeigneten Daten zu messen und gezielter auf den problematischen Bereich zu reagieren. Es ist möglicherweise auch einfacher, das Leistungsproblem zu verstehen, wenn der Code auch leicht verständlich ist.

3

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 Variable vom Typ long hatte

  1. Wenn die Variable vom Typ long ist - wenn nicht initialisiert, wird sie auf 0 gesetzt -, wird dies für den Benutzer verwirrend, wenn er in der GUI angezeigt wird 
  2. Wenn die Variable vom Typ Long ist - wird sie nicht initialisiert, wird sie auf null gesetzt - dieser Nullwert wird nicht in der GUI angezeigt.

Dies gilt auch für Boolean, wo Werte verwirrender sein können, wenn wir primitive boolean verwenden (da der Standardwert false ist).

2
Mohamed Afzal

Performance von Anwendungen, die von numerischen Berechnungen dominiert werden, können von der Verwendung von Grundelementen stark profitieren.

primitive Types, verwendet den Operator ==, für Wrapper wird jedoch die equals () -Methode bevorzugt.

"Primitive Typen als schädlich" weil sie die prozedurale Semantik in ein ansonsten einheitliches objektorientiertes Modell mischen.

Viele Programmierer initialisieren Zahlen auf 0 (Standard) oder -1, um dies anzuzeigen. Dies kann jedoch je nach Szenario falsch oder irreführend sein.

2
loknath

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 aufweisen, z. B. einen Zähler oder eine Boolesche Bedingung.

Seit dem Autoboxen ist die Grenze "Wann benutzt man Primitive oder Wrapper" ziemlich verschwommen.

Denken Sie jedoch daran, Wrapper sind Objekte, sodass Sie alle ausgefallenen Funktionen von Java nutzen können. Beispielsweise können Sie mithilfe der Reflexion ganzzahlige Objekte erstellen, jedoch keine ganzzahligen Werte. Wrapper-Klassen verfügen auch über Methoden wie valueOf.

1
Tom

Wenn Sie einen Werttyp erstellen möchten. So etwas wie ein ProductSKU oder AirportCode.

Wenn ein primitiver Typ (Zeichenfolge in meinen Beispielen) Gleichheit definiert, müssen Sie die Gleichheit überschreiben.

1
Chris Missal

Primitive Werte in Java sind kein Objekt. Um diese Werte als Objekt zu bearbeiten, enthält das Java.lang-Paket eine Wrapper-Klasse für jeden primitiven Datentyp. 

Alle Wrapper-Klassen sind endgültig. Die Objekte aller Wrapper-Klassen, die instanziiert werden können, sind unveränderlich, dh der Wert im Wrapper-Objekt kann nicht geändert werden.

Die void -Klasse wird zwar als Wrapper-Klasse betrachtet, jedoch werden keine primitiven Werte eingebunden und ist nicht unersättlich. Es hat keinen öffentlichen Konstruktor, sondern bezeichnet nur ein Klassenobjekt, das das Schlüsselwort void darstellt.

0
Ahmad Sayeed