Info bei Datenänderung

HI

Folgendes Ziel habe ich:
Wenn ich in einer Klasse daten ändern, sollen bestimmte andere Methoden informiert werden.

das habe ich bisher:

Java:
package ereignisverwaltung;

import java.util.LinkedList;

public class Ereignisverwaltung {
	private static LinkedList<Ereignis> e = daten.EreignisListe.getEreignisliste();
	
	/**
	 * Informiert bei Datenänderungen<br>
	 * 
	 * @param Absender = this (also die classe)
	 * @param Wobei: Duell, Ergebnis 
	 */
	
	
	public static void informiereMich(Object Absender, String Wobei){
		Ereignis e1 = new Ereignis(Absender, Wobei);
		e.add(e1);
	}
	
	public static void infoAussenden(){
		if (e != null) {
			if (e.size()!=0) {
				for (Ereignis e1 : e) {
					e1.getAbsender(); // HIER SOLL DER ABSENDER AUFGERUFEN WERDEN
				}
			}
		}
	}
	
}



Die Datenklasse ruft nun infoAussenden auf, dort sollen jetzt alle in der linkedlist befindlichen klassen aufgerufen werden.
Beim Absender gibt es eine Methode die nennt sich DatenGeändert (über Interface vorgeschrieben), wie aber rufe ich dieses auf ???
e1.getAbsender().Datengeändert() geht leider nicht.

Die Anmeldung an diesen Dienst erfolgt über
Java:
Ereignisverwaltung.informiereMich(this, null);
Über die Methode informiereMich melden sich andere Methoden an, als Absender geben diese Klassen this mit, somit sollte darin eine referenz zu der klasse enthalten sein.
 

Kevin94

Top Contributor
Mal abgesehen davon das ich dein Konzoet nicht ganz nachvollziehen kann, muss du den Typ von Absender ändern, z.B. auf das Interface in dem die Methode datenGeändert vorgeschrieben wird.
 
Dein Absender ist von der Klasse Object. Object hat keine Methode DatenGeaendert (in Java NIEMALS UMLAUTE. Außerdem werden Methodenanfänge klein geschrieben).

Du musst entweder bei der Methode informiereMich als Übergabetyp dein Interface angeben
Code:
informiereMich(Interface absender, String wobei)
(auch hier der Vermerk, Objektanfänge werden klein geschrieben), dann musst du auch die Klasse Ereignis dementsprechend abändern,
oder du castest in der Methode infoAussenden auf dieses Interface
Code:
((Interface)e1.getAbsender()).datenGeaendert()
, diese Lösung aber nur wenn du dir sicher bist das alle Ereignissabsender von diesem Interface ableiten, sonst kriegst du ne ClassCastException.
In beiden Codebeispielen musst du Interface durch den Namen des Interfaces ersetzen.
 
T

theawak3r

Gast
Das was du beschreibst, komt dem Observer Pattern, welches in Java bereits implementiert ist, ziemlich nahe.. Wieso verwendest du nicht das? ODer möchtest du es selber basteln? Dann würde ich nahc Observer Pattern googlen :p
 
Ja, das hab ich mir auch schon gedacht :D Aber auch wenn er den String wobei (noch) nicht verwendet gibt es diesen (glaub ich) beim Java implementierten Observer nicht.
 
Der Observer war auch das erste was ich dazugefunden habe, jedoch wurde mir das andere empfohlen.

So, hab die Methode nun so angepasst (umlaute habich vorerst belassen):
Java:
package ereignisverwaltung;

import java.util.LinkedList;

public class Ereignisverwaltung {
	private static LinkedList<Ereignis> e = daten.EreignisListe.getEreignisliste();
	
	/**
	 * Informiert bei Datenänderungen<br>
	 * 
	 * @param Absender = this (also die classe)
	 * @param Wobei: Duell, Ergebnis 
	 */
	
	
	public static void informiereMich(I_DatenÄnderungenInfo absender, String wobei){
		Ereignis e1 = new Ereignis(absender, wobei);
		e.add(e1);
	}
	
	public static void infoAussenden(){
		
		if (e != null) {
			if (e.size()!=0) {
				for (Ereignis e1 : e) {
					System.out.println("Ereignisverwaltung - absenderaufruf " + e.toString());
					e1.getAbsender(); // HIER SOLL DER ABSENDER AUFGERUFEN WERDEN
				}
			}
		}
	}
	
}

hier noch das interface:
Java:
package ereignisverwaltung;

public interface I_DatenÄnderungenInfo {

	public void DatenGeändert (String datenklasse);
	
}

Diesen einen String -wobei- dient nur als späteres auswahlkriterium, könnte ich eigentlich weglassen, wird eben mehr aktualisiert, ist aber egal.

bis zu den Punkt komme ich nun bei einer datenaktualisierung:
Java:
					System.out.println("Ereignisverwaltung - absenderaufruf " + e.toString());
					e1.getAbsender(); // HIER SOLL DER ABSENDER AUFGERUFEN WERDEN
jedoch bekomme ich ja mit e1.getAbsender() die Referenz zu der Klasse, oder ???
Wie jedoch rufe ich nun die Methode DatenGeändert() auf ???

:bahnhof:
 
Du bekommst die Referenz auf das Objekt und kannst auf das gleich die Methode datenGeaendert aufrufen. Aber nur wenn die Methode getAbsender() auch als Rückgabewert das Interface hat. Wenn sie das nicht hat musst du casten wie ich es oben schon beschrieben habe, also:
Code:
((I_DatenAenderungenInfo)e1.getAbsender()).datenGeaendert(null);
Wobei du statt null die Info einsetzten musst die du aussenden willst. Aber so compiliert es auf jeden Fall schon mal.
 
In deinem Javadoc-kommentar hast du " * @param Absender = this (also die classe)" geschrieben. this ist nicht die Klasse sondern das Objekt. Die Klasse würdest du über this.class bekommen, aber die willst du ja gar nicht.
 
Kommt drauf an. Ich hab deine Aussage so verstanden das du mich drauf aufmerksam machen wolltest das ich die Umlaute, die bei seiner Methodensignatur vorhanden sind, weggelassen habe. Wenn du das gemeint hast, musst du meine Antwort verstehen. Wenn nicht, dann versteh ich deine Aussage nicht.
 
S

SlaterB

Gast
@timbeau
deine Aussage ist wirklich auch nicht zu verstehen, ae im Code ist was ganz anderes als ä,
was soll man noch mehr machen?
generell andere deutsche Worte zu suchen oder komplett auf englisch zu wechseln kannst du nicht im Ernst verlangen
 
:toll: es funktioniert


In deinem Javadoc-kommentar hast du " * @param Absender = this (also die classe)" geschrieben. this ist nicht die Klasse sondern das Objekt. Die Klasse würdest du über this.class bekommen, aber die willst du ja gar nicht.

hier noch eine Frage (wobei, eigentlich könnt ichs ausprobieren auch ....)
wenn ich this.class übergabe, müsste ich ja dann eigentlich die ganzen methoden davon aufrufen können mit Absender.Methodenname, oder ???

Umlaute kommen demnaechst weg ....
 
Nein. this.class ist ein Object der Klasse Class und stellt nur Class-Methoden, wie getCanonicalName() zur Verfügung um nicht-static Methdoden aufzurufen brauchst du ein Objekt der Klasse und für Static-Methoden, tja, weiß grad auch nicht, eigentlich sollten die sich irgendwie über das class-objekt erreichen lassen, aber ich weiß nicht wie. Normalerweise ruft man sie über Klasse.static-Methode() auf.

Du kennst doch den Unterschied zwischen einer Klasse, einem Objekt und einem Objekt der Klasse Class, oder?
 

timbeau

Gesperrter Benutzer
Ich habe einfach ä in ae umgewandelt um auf die Umlaute hinzuweisen. Die Posts von Ulic hab ich garnicht gesehen.

Daher war auch mein "immernoch Umlaute im Code" auf den Code des TE bezogen. Auf einen Post der keine Umlaute verwendet macht so eine Aussage ja auch keinen Sinn.

Schön, dass es klappt.
 
Ich habe einfach ä in ae umgewandelt um auf die Umlaute hinzuweisen. Die Posts von Ulic hab ich garnicht gesehen.

Daher war auch mein "immernoch Umlaute im Code" auf den Code des TE bezogen. Auf einen Post der keine Umlaute verwendet macht so eine Aussage ja auch keinen Sinn.

Schön, dass es klappt.

Aber er hat ja geschrieben: (umlaute habich vorerst belassen)

Daher hab ich nicht kapiert worauf du hinaus wolltest.
 
Nein. this.class ist ein Object der Klasse Class und stellt nur Class-Methoden, wie getCanonicalName() zur Verfügung um nicht-static Methdoden aufzurufen brauchst du ein Objekt der Klasse und für Static-Methoden, tja, weiß grad auch nicht, eigentlich sollten die sich irgendwie über das class-objekt erreichen lassen, aber ich weiß nicht wie. Normalerweise ruft man sie über Klasse.static-Methode() auf.

Du kennst doch den Unterschied zwischen einer Klasse, einem Objekt und einem Objekt der Klasse Class, oder?

Ein Objekt ist quasi das oberste, von dem alles abgeleitet wird.
So auch eine Klasse, welche eine Spezialisierung von Object ist.
zumindest habe ich das so vom Kurs in Erinnerung.

jedenfalls Danke, bei meinem nächsten Problem werdet Ihr wieder von mir hören :)
 
Oh, ach so, da hast du mich etwas falsch verstanden.

Es gibt die Klasse Object, die ist das oberste von dem alles abgeleitet wird.
Wenn du jetzt das hier machst:
Code:
String s = new String();
dann ist s eine Referenz auf ein Objekt der Klasse String (String ist wiederrum von der Klasse Object abgeleitet). Aber das Objekt das man mithilfe eines Konstruktors erzeugt und die Klasse Object hängen nicht direkt zusammen. Es gibt auch das hier:
Code:
Object o = new Object();
. Jetzt hat o eine Referenz auf dein Objekt der Klasse Object. Weiß nicht wirklich ob ich das gut beschreibe, aber den Unterschied solltest du kennen, sonst könnt es dir schwer fallen manche Hilfestellungen zu verstehen.
 

Ähnliche Java Themen

Neue Themen


Oben