S
Spacerat
Gast
Also, ich hatte mal folendes ausprobiert als ich mir einen Cache für Bilder (bzw. Texturen) basteln wollte.
Nun die grosse Preisfrage: Was glaubt ihr was passiert nach der "equals();"-Methode. Landet es im Vector "cache" oder nicht?
Ok. Das kann ich schon mal beantworten. Es landet im Cache! Allerdings völlig zu unrecht, da img1 hier ein Element von einem existierenden Cache simulieren soll, welches mit einem anderen verglichen werden soll. Man sieht aber deutlich, das beide Bilder "equal" sind. Warum wird also false zurückgegeben?
Huch, selbst dafür hab' ich noch 'ne Antwort auf Lager. Und zwar folgende: BufferedImage, sowie dessen Interfaces und Vaterklassen implementieren allesammt die Methode "equals()" nicht. Daher wird "Object.equals()" verwendet, welche wie folgt aussieht.
Aha! Und nu? Hier wird eindeutig der inhaltliche Vergleich in einen Objekt-Vergleich umgewandelt, was aber noch nicht allzu schlimm ist, da es an dieser Stelle die beste Möglichkeit darstellt. Wenn man nun noch die Klassen ausserhalb von "java.lang" unter die Lupe nimmt, fällt einem auf, das die wenigsten davon eine "equals()"-Methode besitzen. Deshalb kommt jetzt mal die rein rhetorische Frage, welche eigentlich an SUN gehen müsste:
Welchen Sinn macht "equals()" wenn es nicht vernünftig implementiert wird?
cu Spacerat
P.S.: Ich erwarte natürlich keine direkte Antwort darauf, allerdings wären einige Stellungnahmen angebracht. Zuletzt habe ich meinen Cache doch noch hinbekommen. BufferedImage extended und bei "equals()" die beiden in zwei "int[]"-Arrays gelesen und deren Werte verglichen.
Code:
Vector<BufferedImage> cache = new Vector<BufferedImage>();
BufferedImage img1 = new BufferedImage(10, 10, BufferedImage.TRANSLUCENT);
BufferedImage img2 = new BufferedImage(10, 10, BufferedImage.TRANSLUCENT);
if(!img1.equals(img2)) cache.add(img2);
Nun die grosse Preisfrage: Was glaubt ihr was passiert nach der "equals();"-Methode. Landet es im Vector "cache" oder nicht?
Ok. Das kann ich schon mal beantworten. Es landet im Cache! Allerdings völlig zu unrecht, da img1 hier ein Element von einem existierenden Cache simulieren soll, welches mit einem anderen verglichen werden soll. Man sieht aber deutlich, das beide Bilder "equal" sind. Warum wird also false zurückgegeben?
Huch, selbst dafür hab' ich noch 'ne Antwort auf Lager. Und zwar folgende: BufferedImage, sowie dessen Interfaces und Vaterklassen implementieren allesammt die Methode "equals()" nicht. Daher wird "Object.equals()" verwendet, welche wie folgt aussieht.
Code:
public boolean Object equals(Object obj)
{
return this==obj;
}
Aha! Und nu? Hier wird eindeutig der inhaltliche Vergleich in einen Objekt-Vergleich umgewandelt, was aber noch nicht allzu schlimm ist, da es an dieser Stelle die beste Möglichkeit darstellt. Wenn man nun noch die Klassen ausserhalb von "java.lang" unter die Lupe nimmt, fällt einem auf, das die wenigsten davon eine "equals()"-Methode besitzen. Deshalb kommt jetzt mal die rein rhetorische Frage, welche eigentlich an SUN gehen müsste:
Welchen Sinn macht "equals()" wenn es nicht vernünftig implementiert wird?
cu Spacerat
P.S.: Ich erwarte natürlich keine direkte Antwort darauf, allerdings wären einige Stellungnahmen angebracht. Zuletzt habe ich meinen Cache doch noch hinbekommen. BufferedImage extended und bei "equals()" die beiden in zwei "int[]"-Arrays gelesen und deren Werte verglichen.