Java Sind genric casts der folgenden Art teuer?

T

Tersus

Gast
Code:
...
    private final Class<T> type;
    private T value;

    public <A> boolean setValue(final Class<A> type, final A value) {

		final boolean success = this.type == type;

		if (success)
			this.value = (T) value;

		return success;
	}
...

Ich überprüfe mit dieser Logik genau, ob die Typen identisch sind und wenn ja, dann caste ich. Die Frage: Ist dieser Cast trotzdem rechenintensiv? Die Methode ist bewusst so implementiert.

Diese Variante braucht ihr mir nicht vorschlagen.
Code:
...
    private final Class<T> type;
    private T value;

    public void setValue(final T value) {

        this.value = value;
    }
...
Spätestens, wenn man die Klasse in einer Collection halten möchte, funktioniert diese Methode nicht.
 
Der '==' ist hier ausdrücklich erwünscht, da Class-Instanzen Singletons sind. Das zu Diskutieren soll aber nicht das Thema sein. ;)
 
Dann würde ich sagen "Push" da mich das speziell mit den Kosten auch wunder nimmt. :)
 
Programmier Dir eine Schleife, die das eine 1 Min lang macht und eine die das andere 1 Min macht und vergleiche die Anzahl der durchläufe.

Oder mache beides 10 Mio mal und vergleiche die Laufzeit.
 
Hängt auch davon ab, wie die Singletons abgesichert sind. Nicht umsonst hat dieses Anti-Pattern Schimpfnamen wie "Fewton" oder "Oligoton" erhalten.

Verwendet lieber Dependency Injection...

@edit: wozu brauchst du den Cast, wenn die Typen eh zuweisungskompatibel sind?

greetz
​hroessler
 
Zuletzt bearbeitet von einem Moderator:
Nach meinem Verständnis kostet ein generischer 'cast' nichts, da er nichts macht. Die information über den Typ liegt nur zur compile-Zeit vor.
Aber ein echter 'cast' braucht natürlich prinzipiell Zeit, da die JVM prüft, ob der Typ passt und ansonsten eine 'ClassCastException' wirft. Da ist es auch egal, ob davor eine explizite Prüfung stattfindet.
'Teuer' ist das Ganze aber auf jeden Fall nicht. Vermutlich optimiert die JVM solche Prüfungen auch, wenn sie öfters stattfinden.
 
Zurück
Oben