Java Frage zum Typecast

ascer

Captain
Registriert
Juni 2008
Beiträge
3.860
Huhu Community :)


folgendes Szenario: sagen wir mal, ich habe eine Klasse A, eine Klasse B und eine Klasse Datum, nur als Beispiel.
A ist Observable und macht irgendwas. B implementiert Observer und beobachtet A.

Jetzt verändert A irgendwas an seinen Exemplarvariablen und macht dabei natürlich brav setChanged() und notifyObservers().

Es ändert allerdings immer nur ein in sich gespeichertes Datum, weshalb im notify das geänderte Datum übergeben wird.

Also notifyObservers(getNeuesDatum())

B kann auch immer nur ein Datum in Form eines Exemplars der Klasse Datum verarbeiten.

d.h. B's update(Observer o, Object arg)-Methode, die in Folge des notifyObservers aufgerufen wird, verarbeitet auch immer nur ein Datum.

Dann muss natürlich die Verarbeitung so aussehen: verarbeiteMal( (Datum)arg )

Denn arg ist ja nur vom Typ Object, um spezifisch das Datum verarbeiten zu können, obwohl in arg ja eine Referenz auf ein Exemplar von Datum gehalten wird, muss ja ein Typecast her um zuzusichern, dass es sich bei arg dann auch wirklich um ein Datum handelt.


Was würde jetzt passieren, wenn aus Versehen von notifyObservers doch kein Datum übergeben wird, sondern irgendwas anderes. Ne NullReference oder halt irgendwas ganz anderes, kein Typ Datum?

Was macht dann mein Typecast mit arg?

Was wäre der schönste Weg, um zu verhindern, dass da was schief läuft?
Könnte ich eine Exception bauen, die dann aufgerufen wird, wenn arg auf kein Exemplar von Datum zeigt z.B.?

Also quasi checken, ob arg ne Instanz von Datum ist und wenn nein, dann Exception werfen?

Oder wie wäre der praktikabelste Weg dort?



Grüße & Danke im Voraus

ascer
 
also wäre dann eine vernünftige sinnvolle Anpassung in etwa:

Code:
if( !(arg instanceOf Datum) )
{
   // Exception werfen...
}

oder?
 
Zuletzt bearbeitet:
Das ist dir dann überlassen.
Du kannst eine Exception werfen, die dann aber auch irgendwo behandelt werden sollte.
Fehlermeldung an den Nutzer übergeben, irgendwas in ein Log schreiben, das Programm beenden, etc.

Du musst ja entscheiden was in diesem Fall passieren soll.
 
Das die Java-API Observable/Observer nicht als Generics anbietet, wird oftmals als eklatante Schwachstelle gesehen. Da bietet es sich an, das selbst als Generic zu implementieren. Wird z.B. in diesem Buch gut beschrieben: Java ist auch eine Insel, Kapitel 10.2.2 Das Beobachter-Pattern (Observer/Observable). Einfach bis zur Überschrift "Schwierigkeiten von Observer/Observable" runterscrollen. Ansonsten gibt es noch englischsprachige Beiträge, die auf eine ähnliche Lösung zielen.

Einen cast an der Stelle würde ich eher als Bad Practice ansehen.
 
Vielen Dank :)
 
Zurück
Oben