Wie wird der Nullable-Primitivtyp int in Java dargestellt?
Ich bin der Gestaltung eines entity-Klasse, die ein Feld mit dem Namen "documentYear", die vielleicht unsigned integer-Werte wie 1999, 2006, etc. Inzwischen ist dieser Bereich könnte auch "unbekannt",,, nicht sicher, aus welchem Jahr das Dokument erstellt wird.
Daher eine null - int Art, wie in C# gut geeignet. Jedoch in Java nicht haben eine null-Funktion als C# hat.
Habe ich zwei Möglichkeiten aber ich weiß nicht, wie Sie beide:
- Verwenden
java.lang.Integer
statt der primitiven Artint
; - Verwenden Sie -1, um die "unbekannten" Wert
Hat jemand bessere Möglichkeiten oder Ideen?
Update: Meine entity-Klasse wird von zig-tausenden von Fällen; daher ist der overhead von java.lang.Ganze Zahl ist möglicherweise zu schwer für die Gesamtleistung des Systems.
InformationsquelleAutor der Frage yinyueyouge | 2009-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du gehst zu haben, um entweder Graben der primitive Typ oder die Nutzung einer beliebigen int-Wert als "ungültig Jahres".
Einen negativen Wert, ist eigentlich eine gute Wahl, da gibt es wenig chance, dass Sie eine gültige Jahr dazu führen würde, dass ein integer-überlauf und es ist kein gültiges negatives Jahr.
InformationsquelleAutor der Antwort hhafez
Mit der Integer-Klasse ist hier wohl, was Sie tun möchten. Der Aufwand mit dem Objekt ist wahrscheinlich (aber nicht notwendigerweise) trivial, um Ihre Anwendungen die Allgemeine Reaktionsfähigkeit und Leistung.
InformationsquelleAutor der Antwort Matthew Vines
Zehntausende von Instanzen von Integer ist nicht viel. Betrachten aufwendet, ein paar hundert Kilobyte anstatt optimieren vorzeitig. Es ist ein kleiner Preis zu zahlen für die Richtigkeit.
Hüten Sie sich vor der Verwendung von sentinel-Werte, wie
null
oder0
. Dies ist im Grunde Mengen liegen, da0
ist nicht ein Jahr, undnull
ist keine ganze Zahl. Eine häufige Quelle von Fehlern, vor allem, wenn Sie an einem gewissen Punkt sind nicht die einzigen maintainer der software.Erwägen Sie die Verwendung einer typsicheren null wie
Option
manchmal bekannt alsMaybe
. Beliebt in Sprachen wie Scala und Haskell, das ist wie ein container, der eine oder keine Elemente. Ihr Bereich wäre der TypOption<Integer>
die damit wirbt die Freiwilligkeit der dein Jahr-Feld das Typ-system und andere Kräfte-code zum Umgang mit eventuell fehlenden Jahre.Hier ist eine Bibliothek, die beinhaltet die Option Typ.
Hier ist, wie würden Sie das nennen Sie Ihren code, wenn Sie verwendet wurden:
InformationsquelleAutor der Antwort Apocalisp
Weitere option ist, um eine zugeordnete
boolean
flag, das angibt, ob oder nicht Ihr Jahr Wert gültig ist. Dieses flag wirdfalse
würde bedeuten, das Jahr ist unbekannt. Dies bedeutet, dass Sie haben zu prüfen, eine primitive (boolean) um zu wissen, ob Sie einen Wert haben, und wenn Sie das tun, prüfen Sie noch primitiv (integer).Sentinel-Werte führt oft in fragilen-code, so dass es sich lohnt, die Anstrengung zu vermeiden, um die sentinel-Wert, es sei denn, Sie sind sehr sicher, dass es nie einen Anwendungsfall.
InformationsquelleAutor der Antwort Eddie
Können Sie einen regulären int, aber mit einem Wert wie
Integer.MAX_VALUE
oderInteger.MIN_VALUE
definierte Konstanten als Ihre ungültiges Datum. Es ist auch offensichtlich, dass -1 oder einen geringen negativen Wert, dass es ungültig ist, wird es sicherlich nicht Aussehen wie eine 4-stellige Datum, das wir zu sehen gewohnt sind.InformationsquelleAutor der Antwort Kekoa
Wenn Sie eine ganze Zahl und sind besorgt, dass ein beliebiger Wert für null verwechselt werden könnte mit einem echten Wert, Sie könnte lange statt. Es ist effizienter als die Verwendung einer Integer und Long.MIN_VALUE ist nicht, wo in der Nähe keine gültigen int-Wert.
InformationsquelleAutor der Antwort Peter Lawrey
Vollständigkeit halber, eine weitere Möglichkeit (sicher nicht die effizienteste), ist die Verwendung einer wrapper-Klasse
Year
.Oder, wenn es mehr semantische, oder Sie möchten mehrere Typen der null-Ganzzahlen (Andere als Jahre), Sie imitieren können C# Nullable Grundelemente, wie so:
InformationsquelleAutor der Antwort azz
Mithilfe der int primitive vs die Integer Typ ist ein perfektes Beispiel für die vorzeitige Optimierung.
Wenn Sie die Mathematik zu tun:
Also für 10.000 ints es werden Kosten von 40.000 bytes oder 40k. Für 10.000 ints es werden Kosten von 160.000 bytes oder 160K. Wenn Sie erwägen, den erforderlichen Arbeitsspeicher für die Verarbeitung von Bildern/Fotos/video-Daten, die praktisch vernachlässigbar.
Mein Vorschlag ist, beenden Sie verschwenden Zeit vorzeitig die Optimierung basiert auf Variablen, Typen und suchen einen guten Daten-Struktur, die machen es einfach für die Verarbeitung aller Daten. Unabhängig davon, dass Sie das tun, es sei denn, Sie definieren, 10K primitiven Variablen individuell, es geht, um am Ende auf dem heap jedenfalls.
InformationsquelleAutor der Antwort Evan Plaice
Was ist falsch mit java.lang.Integer? Es ist eine vernünftige Lösung, es sei denn Sie speichern sehr große Mengen von diesem Wert vielleicht.
Wenn Sie wollte primitives, ein Wert von -1 würde eine gute Lösung. Die einzige andere option, die Sie haben über ein separates Boolesches flag, wie jemand schon vorgeschlagen. Wählen Sie Ihr Gift 🙂
PS: verdammt, ich war versucht zu entkommen, mit einem kleinen weißen Lügen auf die Objekte vs Strukturen. Mein Punkt war, dass es mehr Speicher benötigt, ähnlich wie das boolean-flag-Methode, obwohl syntaktisch der nullable-Typ ist, ist schöner natürlich. Auch war ich nicht sicher, dass jemand mit einem Java-hintergrund würde wissen was ich meinte mit struct.
InformationsquelleAutor der Antwort Thorarin
java.lang.Integer ist sinnvoll für diesen Fall. Und es ist schon implementiert Serializable, damit Sie sparen können, einfach nur die Jahr-Feld unten, um die Festplatte und laden Sie es zurück.
InformationsquelleAutor der Antwort Truong Ha
Weitere option könnte sein, die verwenden einen speziellen Wert, der intern (-1 oder Integer.MIN_VALUE oder ähnliches), aber aussetzen der integer-als zwei Methoden:
InformationsquelleAutor der Antwort MB.
Wenn du gehst, um Speicherplatz zu sparen, würde ich vorschlagen, Verpackung mehrere Jahre in einem einzigen
int
. So0
istnil
. Dann machen Sie Annahmen, um zu optimieren. Wenn Sie arbeiten nur mit den aktuellen Daten, wie Jahre 1970-2014, können Sie subtrahieren 1969 von allen von Ihnen, und Sie kommen in1—55
Bereich. Solche Werte programmiert werden können, mit nur 6 bit. So können Sie teilen Sie Ihreint
das ist immer 32 bit, die in 4 Zonen, mit einem Jahr dort. Auf diese Weise können Sie pack 4 Jahre im Bereich 1970-2226 in einem einzigenint
. Die schmalen Ihre Auswahl ist, wie nur 2000-2014 (4 bits), die mehr Jahre, die Sie packen kann, in einem einzigenint
.InformationsquelleAutor der Antwort Aleks N.
Du könntest das @Nullable-Anmerkung bei Verwendung von java 7
InformationsquelleAutor der Antwort user3231931