OOP Mit Generics auf Methoden zugreifen?

membersound

Bekanntes Mitglied
Hallo,

ich versuche mir gerade einen generische CRUD Service zu bauen, um mir den immer wieder kehrenden crud Code für die einzelnen Implementierungen zu sparen.
Funktioniert auch ganz gut, nur frage ich mich: kann ich irgendwie mit Generics auf eine (nicht bekannte) Methode wie getId() zugreifen?

In der Facade würde ich gerne nur ein delete(c) ausführen. Und mir die id dann innerhalb des Services angeln. Nur geht dort t.getId() verständlicherweise nicht.
Deshalb: gibt es eine Möglichkeit sowas zu implementieren, oder muss ich mit der Lösung leben das komplette Objekt und zusätzlich noch seine ID übergeben zu müssen?

Danke

Java:
public class BaseService<T> {
	@Inject
	EntityManager em;

	@Override
	public void delete(T t, Object id) {
		Object ref = this.em.getReference(t.getClass(), id); //t.getId() geht hier leider nicht
		this.em.remove(ref);
	}
}
Java:
public class Facade {
	@Inject
	private BaseService<Customer> service;

	public void deleteSelected(Customer c) {
		service.delete(c, c.getId());
	}
}
 

bERt0r

Top Contributor
Du brauchst ein Interface mit der Funktion getId, welches deine Klassen implementieren. Dann kannst du durch "public class BaseService<T extends ObjektMitId>" auf die getId Funktion zugreifen.
 

membersound

Bekanntes Mitglied
Aber wenn ich zb [c]public class BaseService<T extends Customerinterface>[/c] schreibe, habe ich ja doch wieder x Klassen (bzw Interfaces) hinterher. Ich möchte das ja gerade alles auf nur eine DAO/Service reduzieren.
Sodass mir der simple Aufruf BaseService<Customer> reicht, um service-methoden für eine bestimmte Klasse ausführen zu können.
 

bERt0r

Top Contributor
Ja das kannst du doch. Es ist nur einfach so, dass wenn du von deiner BaseService Klasse aus erwartest, dass die T Klasse eine Funktion getId bereitstellt, heisst das, dass deine BaseService Klasse auch nur mit Klassen funktioniert, die ein Interface implementieren welchens getId definiert, anders gehts (fast) nicht.
Es wäre noch möglich mit Reflection auf sämtliche auf Fields und Methoden einer Klasse zuzugreifen, vielleicht entspricht das eher deinen Erwartungen.
 
B

bygones

Gast
Aber wenn ich zb [c]public class BaseService<T extends Customerinterface>[/c] schreibe, habe ich ja doch wieder x Klassen (bzw Interfaces) hinterher. Ich möchte das ja gerade alles auf nur eine DAO/Service reduzieren.
Sodass mir der simple Aufruf BaseService<Customer> reicht, um service-methoden für eine bestimmte Klasse ausführen zu können.
es ist ein Unterschied ob es einen Verwender von X gibt oder mehrere Implementierungen von X. Wenn es nur eine Implementierung von X geben soll ist die Frage ob alles mit einer Klasse erledigt werden kann. Oder ob es eine Vaterklasse X gibt und dann nur noch - falls noetig abweichende Implementierungen und dein generischer Aufruf ist dann [c]T extends Vaterklasse[/c]. X muss ja nicht unbedingt ein Interface sein, geht ja auch eine (abstrakte) Klasse
 
T

Tomate_Salat

Gast
Es gibt noch eine alternativ. Allerdings würde ich dir eher zu dem Raten, was bereits gesagt worden ist. (Also eine [abstrakte] Klasse oder ein Interface verwenden).


Java:
class UseMe
{
	public int getId() 
	{
		return 42;
	}
}

public class Sample 
{
	
	public static void main(final String[] args) 
	{
		UseMe um=new UseMe();
		printId(um);
	}
	
	public static void printId(final Object o)
	{
		Class<?> oClass=o.getClass();
		try {
			Method m=oClass.getMethod("getId");
			System.out.println("Id: " + m.invoke(o));
		} catch (Exception e) {
			// Klasse kann eben nicht verwendet werden
			e.printStackTrace();			
		} 
	}	
}

Aber wie bereits angesprochen: Wenn du möchtest, dass eine Klasse bestimmte Methoden implementiert, dann verwende ein Interface/eine (abstrakte)Klasse. Damit bist du gezwungen, die Methoden bereitzustellen. Bei der Lösung via Reflection ist dies nicht der Fall und ist imho Fehleranfälliger und Aufwändiger.
 

membersound

Bekanntes Mitglied
Ach klar, ich war irgendwie verwirrt. Das mit dem Interface leuchtet mir ein.

Jetzt habe ich quasi 3 Möglichkeiten:
a) Interface mit id in jeder Entity implementieren
b) abstrakte Klasse mit id extenden
c) @mappedsuperclass mit id extenden

Kann man generell sagen welche Variante die bessere ist? Oder ist das Geschmackssache?

Bei den Möglichkeiten mittels Vererbung wäre der Vorteil, dass ich das Id Feld nur 1x implementieren muss in der Superklasse. Was wiederum schön Codeduplikation einspart. Und jede Klasse bekommt ja sowieso eine Id.
Bei Tieren zB wäre extend einleuchtend: Dog extends Animal, Cat extends Animal.
Ich habe aber eher Beziehungen wie Customer, Person, Payment, Item usw vorliegen. Wäre es da trotzdem richtig von der selben Superklasse zu erben (um das DRY Prinzip einzuhalten)?
 
Zuletzt bearbeitet:

membersound

Bekanntes Mitglied
??? dann verstehe ich den Sinn dahinter allerdings nicht, wenn sowohl abstract class als auch Interface bloß für die ID zuständig sind...
[c]Customer extends AbstractClass implements Interface[/c]
 
Zuletzt bearbeitet:
M

maki

Gast
Wird so oft gemacht und genutzt dass du dass schon garantiert mehrmals beutzt hast, wahrscheinlich ohne es zu merken... Collections zB.

Interface + abstrakte Klasse welche das Interface implementiert

Dein typ T ist natürlich viel zu weit gefasst.
 
B

bygones

Gast
??? dann verstehe ich den Sinn dahinter allerdings nicht, wenn sowohl abstract class als auch Interface bloß für die ID zuständig sind...
[c]Customer extends AbstractClass implements Interface[/c]

wenn wir wirklich NUR ueber eine getId Methode reden ist es natuerlich fraglich, vor allem wenn die Klassen, die das betrifft eine andere Vererbungslinie haben. Aber man nutzt ein Interface meist zum generellen Definieren von Funktionalitaet und die abstrakte Klasse als Art Templateimplementierung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Generics Methoden Java Basics - Anfänger-Themen 7
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10
K Aufgabe Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben