ich habe eine abstrakte klasse A, welche bestimmte eigenschaften kapselt. zb schlüssel, name, beschreibung, etc.
zusätzlich werden bestimmte werte festgehalten. zb erwartet die Klasse FloatA float-werte (und bietet dann zusätzliche methoden um mit diesen werten etwas zu tun).
es gibt etliche klassen, die A erweitern. jede davon soll Methoden wie setValue(..) oder doSomethingWithValue(..) haben.
dadurch entsteht aber viel redundanter code, da ich zb möchte, dass bei einem null-Objekt eine fehlermeldung ausgegeben wird oder dass geprüft wird, ob der alte wert dem neuen entspricht (dann muss der wert nicht geändert werden). Diesen Code möchte ich daher in die abstrakte klasse A geben.
Weiters will ich, dass man auch nur mit dem abstrakten Typ arbeiten kann, es also ein A.setValue(..) gibt, wobei dann der werttyp eine Superklasse aller anderen Typen sein muss (in meinem Fall Object).
aufgrund der kontravarianz von java bei den methodenparametern kann ich ein setValue(Object) aber nun nicht mit setValue(Float) überschreiben (und dann super.setValue(value) callen). ich möchte aber trotzdem, dass der typ gecheckt wird.
mein ansatz war nun, den erwarteten typ (im konstruktor) zu übergeben (also zb Float.class) und dann in der abstrakten klasse den typ zu überprüfen. ich kann somit den code, der alle A betrifft in A implementieren und dann zb noch ne abstrakte methode doSomethingWithValueImpl(Object) definieren, die die untertypen dann implementieren (dort kann ich mir dann die checks sparen, hab also keine redundanzen mehr).
das funktioniert auch soweit. meine frage ist jetzt nur, ob dies ein geeignetes pattern für solche probleme ist oder ob es gründe gibt, die gegen diese variante sprechen bzw. bessere lösungen. denn ich das jetzt zwar mal so gemacht, bin mir aber nicht sicher, ob ich in kürze nicht schon wieder auf etwas stoße, wo diese variante nicht so ideal sein könnte. würde mich also freuen, wenn jemand mit mehr erfahrung ein paar worte dazu sagen könnte).
danke!
zusätzlich werden bestimmte werte festgehalten. zb erwartet die Klasse FloatA float-werte (und bietet dann zusätzliche methoden um mit diesen werten etwas zu tun).
es gibt etliche klassen, die A erweitern. jede davon soll Methoden wie setValue(..) oder doSomethingWithValue(..) haben.
dadurch entsteht aber viel redundanter code, da ich zb möchte, dass bei einem null-Objekt eine fehlermeldung ausgegeben wird oder dass geprüft wird, ob der alte wert dem neuen entspricht (dann muss der wert nicht geändert werden). Diesen Code möchte ich daher in die abstrakte klasse A geben.
Weiters will ich, dass man auch nur mit dem abstrakten Typ arbeiten kann, es also ein A.setValue(..) gibt, wobei dann der werttyp eine Superklasse aller anderen Typen sein muss (in meinem Fall Object).
aufgrund der kontravarianz von java bei den methodenparametern kann ich ein setValue(Object) aber nun nicht mit setValue(Float) überschreiben (und dann super.setValue(value) callen). ich möchte aber trotzdem, dass der typ gecheckt wird.
mein ansatz war nun, den erwarteten typ (im konstruktor) zu übergeben (also zb Float.class) und dann in der abstrakten klasse den typ zu überprüfen. ich kann somit den code, der alle A betrifft in A implementieren und dann zb noch ne abstrakte methode doSomethingWithValueImpl(Object) definieren, die die untertypen dann implementieren (dort kann ich mir dann die checks sparen, hab also keine redundanzen mehr).
das funktioniert auch soweit. meine frage ist jetzt nur, ob dies ein geeignetes pattern für solche probleme ist oder ob es gründe gibt, die gegen diese variante sprechen bzw. bessere lösungen. denn ich das jetzt zwar mal so gemacht, bin mir aber nicht sicher, ob ich in kürze nicht schon wieder auf etwas stoße, wo diese variante nicht so ideal sein könnte. würde mich also freuen, wenn jemand mit mehr erfahrung ein paar worte dazu sagen könnte).
danke!