PH4Real
2005-01-09, 22:34:35
So... nachdem ich mich jetzt ziemlich mit Java 1.5 beschäftigen musste, finde ich die meisten Neuerungen sinnvoll und auch nötig.
Aber ein paar Sachen finde ich wirklich fürchterlich. Zum Beispiel das Autoboxing. Da kann es nämlich zu sehr "merkwürdigen" Sachen kommen:
Integer i1 = 127;
Integer i2 = 127;
// i1 == i2: true und i1.equals(i2): true, mmmh... ok das macht auch Sinn
System.out.println((i1 == i2) + " und i1.equals(i2): " + i1.equals(i2));;
Integer i3 = 128;
Integer i4 = 128;
// Arrgh... happy debugging! i3 == i4 wird zu false ausgewertet,
// aber i3.equals(i4) bleibt natürlich bei true!
System.out.println((i3 == i4) + ", aber i3.equals(i4): " + i3.equals(i4));
Dazu gibt es das Kommentar aus dem O'Reilly (Java 1.5 Tiger: A Developer's Notebook):
Remember that int values from -127 to 127 are in that range of immutable wrapper types, so the VM actually uses the same object instance (and therefore memory address) for both i1 and i2. As a result, == returns a true result. You have to watch out for this, as it can result in some very tricky, hard-to-find bugs.
Ich freu mich schon auf wirklich lustige Debug Sessions.
Dann noch ein Kommentar zu den Generics. So sinnvoll sie auch sind, wird sowohl manchmal der Code, als auch die Dokumentation sehr unübersichtlich.
Wenn man sich zum Beispiel die Dokus zu der java.util.Collections Klasse mit ihren statischen Methoden anguckt, muss man doch dann dreimal hinschauen, was denn zum Beispiel die Methode max für ein Return Wert hat:
static <T extends Object & Comparable<? super T>> T max (Collection<?extends T> coll)
Naja... ansonsten kann ich nicht meckern. Mein Favoriten sind eindeutig Enums, foreach Schleife und Annotations. Auch die Generics und die neuen concurrency Klassen finde ich gut. Keine Bereicherung der Sprache stellen für mich static imports und die gruselige Formatter Klasse da (printf).
Aber ein paar Sachen finde ich wirklich fürchterlich. Zum Beispiel das Autoboxing. Da kann es nämlich zu sehr "merkwürdigen" Sachen kommen:
Integer i1 = 127;
Integer i2 = 127;
// i1 == i2: true und i1.equals(i2): true, mmmh... ok das macht auch Sinn
System.out.println((i1 == i2) + " und i1.equals(i2): " + i1.equals(i2));;
Integer i3 = 128;
Integer i4 = 128;
// Arrgh... happy debugging! i3 == i4 wird zu false ausgewertet,
// aber i3.equals(i4) bleibt natürlich bei true!
System.out.println((i3 == i4) + ", aber i3.equals(i4): " + i3.equals(i4));
Dazu gibt es das Kommentar aus dem O'Reilly (Java 1.5 Tiger: A Developer's Notebook):
Remember that int values from -127 to 127 are in that range of immutable wrapper types, so the VM actually uses the same object instance (and therefore memory address) for both i1 and i2. As a result, == returns a true result. You have to watch out for this, as it can result in some very tricky, hard-to-find bugs.
Ich freu mich schon auf wirklich lustige Debug Sessions.
Dann noch ein Kommentar zu den Generics. So sinnvoll sie auch sind, wird sowohl manchmal der Code, als auch die Dokumentation sehr unübersichtlich.
Wenn man sich zum Beispiel die Dokus zu der java.util.Collections Klasse mit ihren statischen Methoden anguckt, muss man doch dann dreimal hinschauen, was denn zum Beispiel die Methode max für ein Return Wert hat:
static <T extends Object & Comparable<? super T>> T max (Collection<?extends T> coll)
Naja... ansonsten kann ich nicht meckern. Mein Favoriten sind eindeutig Enums, foreach Schleife und Annotations. Auch die Generics und die neuen concurrency Klassen finde ich gut. Keine Bereicherung der Sprache stellen für mich static imports und die gruselige Formatter Klasse da (printf).