2010-01-09 8 views
9

Ich bin ein großer Fan von Auto-Boxen in Java, da es eine Menge hässlicher Kesselplatte Code speichert. Ich habe jedoch festgestellt, dass das automatische Unboxing unter bestimmten Umständen verwirrend ist, wenn das Number-Objekt null sein kann. Gibt es eine Möglichkeit zu erkennen, wo das automatische Unboxing in einer Codebase mit einer Javac-Warnung auftritt? Jede andere Lösung, die nur das Auftreten von Unboxing erkennt (z. B. FindBugs oder eine Eclipse-spezifische Compiler-Warnung), wird geschätzt, da ich keine finden kann.Java automatisches Unboxing - gibt es eine Compiler-Warnung?

Um zu klären, ich möchte keine Warnungen beim Boxen generiert werden - nur Unboxing.

Hier ist ein einfaches Beispiel für einen Code, verwirrend Nullpointerexceptions verursachen können:

class Test { 
    private Integer value; 

    public int getValue() { 
     return value; 
    } 
} 

Antwort

1

Eclipse lässt Sie Syntax-Boxen Boxen und Unboxing-Operationen (aber nicht die eine oder andere). Ich habe sie in leuchtendes Rot gesetzt: Wenn beides passiert, bedeutet das, dass ich bei der Abstimmung von Parametern und Argumenten schlampig war.

+0

Danke - ich denke, ich werde das Gleiche tun. Selbst wenn es das Problem nicht auffängt, sollte es das Debuggen des Problems erleichtern. –

+2

Es gibt ein Problem beim Trennen der Boxen von Unboxing-Warnungen: https://bugs.eclipse.org/bugs/show_bug.cgi?id=163065 – Kyle

5

Yup. In Eclipse:

Einstellungen-> Java-> Compiler-> Fehler/Warnings-> Mögliche Programmierung Probleme-> Boxen und Unboxing-Konvertierungen

+0

Sorry vielleicht sollte ich klarer sein (ich werde die Frage ändern). Ich möchte eine Warnung beim Unboxing, aber nicht beim Boxen. –

+0

Ah, keine Eclipse lässt dich nicht zwischen den beiden unterscheiden. – skaffman

+0

@skaffman Hoffentlich wird dies: https://bugs.eclipse.org/bugs/show_bug.cgi?id=163065 implementiert werden. – Kyle

2

Leider gibt es nicht. Dies ist eines der Probleme mit automatischen Unboxing-Nummern. Sie können

  • es auf einen Standardwert initialisieren, wie private Integer value = 0
  • prüfen für null return value != null ? value : 0

Ich persönlich die erste Methode bevorzugen. Im Allgemeinen würde ich denken, dass Sie nicht zu viele Fälle haben würden, in denen Sie eine Nullnummer haben sollten.

Warum verwenden Sie auch einen großen Integer, um den Wert zu speichern. Wenn du nur ein kleines int zurückbringst, warum speicherst du es nicht so?

+0

Manchmal erfordert die API/Schnittstelle Operabilität, int zurückzugeben, während long/BigInteger verfügbar wäre. Oh, wie würde ich gerne eine 'List' mit' Long.MAX_VALUE'-Einträgen haben, aber leider kann ich das nicht tun. – Esko

+0

Sie können eine so große "Liste" haben; es kann dir einfach nicht sagen, dass es so groß ist. In 'LinkedList' zum Beispiel behält es ein Feld' size' vom Typ 'int' bei, prüft aber nie, ob die Größe nicht übergelaufen ist. Es gibt jedoch einige Operationen, die fehlschlagen werden, wenn sichergestellt wird, dass der aktuelle Index * kleiner als * die Größe ist, was nicht gilt, wenn das Feld 'Größe' zu einem negativen Wert übergelaufen ist. – seh

+0

Ich kann eine "Liste" mit Long.MAX_VALUE-Elementen nicht als Drop-In-Ersatz in meinem Code verwenden, aber darauf kommt es an. Ich kenne die Semantik von 'AbstractList' und ähnlichem sehr gut, aber solange das Interface selbst' int' sagt, bin ich daran gebunden. – Esko

1

Ich bezweifle, dass dies ein Warnfall sein wird. Dies ist eine der Eigenarten des Auto-Boxens.

Joshua Bloch behandelt dies in seinem Buch "Effective Java". Im Grunde versucht der Compiler mehr für Sie zu tun als erwartet. Mit anderen Worten, diese Art von Problem ist häufiger mit der Verwendung verbunden, und als Ergebnis ist es schwierig, den Fehler zu erkennen, da der Fehler semantisch einfach nicht da ist.

Verwandte Themen