generische Listener

Status
Nicht offen für weitere Antworten.

maximilius

Mitglied
Ich schreibe gerade eine Anwendung, bei der viele Listener-Interfaces entstehen werden.
Viele der Listener können dann bei der Klasse IrcCommunicator angemeldet werden.
Für die Anmeldung und Nutzung des ersten Listeners habe ich schon die Implementierung geschrieben:
Java:
public class IrcCommunicator extends PircBot {

	protected Vector<MessageListener> messageListeners;
	
	public IrcCommunicator(String loginName) {
		messageListeners = new Vector<MessageListener>();
		setName(loginName);
		setLogin(loginName);
	}
	
	public void addMessageListener(MessageListener newMessageListener) {
		if (newMessageListener != null) {
			messageListeners.add(newMessageListener);
		}
	}
	
	public void removeMessageListener(MessageListener aMessageListener) {
		messageListeners.remove(aMessageListener);
	}
	
	@Override
	protected void onMessage(String channel, String sender, String login, String hostname, String message) {
		for (MessageListener currentMessageListener : messageListeners) {
			currentMessageListener.onMessage(channel, sender, login, hostname, message);
		}
	}
}
Wenn ich jetzt weitere Listener auf die gleiche Art und Weise einfügen würde (Beispielsweise einen ChannelListener), würde ich das DRY-Prinzip verletzen (Dont Repeat Yourself), da der Algorithmus zum an- und abmelden der Listener der gleiche wär.
Gibt es hier die Möglichkeit, generische Typen einzusetzen?
Wenn ja, wie? Diese sind Neuland für mich.

lg Stephan
 
das wird zu nix führen, schon gar nicht falls du

addListener(beliebiger Typ) {
speichere in richtiger Liste;
}

vorhast, getter + setter oder hier einfaches add/ remove kannst du kopieren wie du lustig bist,
das ist kein wertvoller Code/ wertvolles Wissen,

wenn dagegen in den Methoden noch irgendeine individuelle Zeile dazukommt, etwa in jedem add()
'if listener.isSpeakingLanguage(irc)'
dann wird's bisschen unangenehm,

aber auch dann schlage ich keine großen generischen Sprünge vor, ein einfaches

Code:
 public void addMessageListener(MessageListener newMessageListener) {
       addTo(this.messageListeners, newMessageListener);
 }

 public void addAnswerListener(AnswerListener newAnswerListener) {
       addTo(this.answerListeners, newAnswerListener);
 }

 public void addTo(List list, BaseListener listener) {
    ...
 }
kann auch schon was bewirken,
ok, addTo() könnte man generisch machen:

Code:
 public <T extends BaseListener> void addTo(List<T> list, T listener) {
    ...
 }

oder statt einer normalen Liste/ Vector eine spezielle Klasse definieren, die in ihrer add-Methode prüft
 
Zuletzt bearbeitet von einem Moderator:
Schade, genau das schwebte mir vor:
das wird zu nix führen, schon gar nicht falls du

addListener(beliebiger Typ) {
speichere in richtiger Liste;
}

vorhast

Die add- und remove-Methoden sind zwar kein wertvoller Code, aber nehmen wir mal an, ich habe schon 5 Listener implementiert und dann fällt mir auf, das ich noch ein if (listener != null) einbauen muss, habe ich dennoch die Probleme, die auftreten, wenn ich das DRY-Prinzip verletze. (Ich muss an 5 Stellen redundanten Code ändern)

Die addTo() Methode ist da schon ein Schritt in die richtige Richtung. Danke.

lg Stephan
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben