Hallo zusammen,
ich stecke leider gerade etwas in der Klemme, bzw. weiß nicht weiter.
Ich habe jetzt seit knapp 2 Jahren kein Java mehr gemacht und versuche wieder rein zu kommen, indem ich einen Bot für Discord entwickle.
Wer schon mal einen Bot für Discord entwickelt hat, weiß dass dort alles über Listener und Events funktioniert. ( z. B. onGuildMessageReceived - wird aufgerufen wenn im Server eine Nachricht gesandt wurde ) Und da es sehr viele Events gibt, habe ich diese anhand von "Kategorien" in Klassen geordnet ( z. B. alle "onGuildMessageXXX" Methoden in eine Klasse, alle "onGuildMemberXXX" in eine Klasse usw. ).
Nun ist es so, dass ich auch verschiedene einstellungen habe, welche sich von Server zu Server unterscheiden ( können ). Dafür habe ich eine Settings-Klasse. Diese habe ich als Singleton konzipiert, sodass nicht jedes Mal, wenn die eine Klasse einstellungen braucht, diese neu aus config Files oder so gelesen werden müssen. ( zur Info am Rande, diese Klasse enthält eine HashMap in der die Objekte als Values und die ServerID als Key gespeichert sind - Wichtig ist hier also die ServerID, dass mir diese immer zur verfügung steht).
Mein Problem jetzt, ist es, dass ich im Konstruktor der jeweiligen Klassen die ServerID nicht zur verfügung habe, diese bekomme ich immer erst durch die Methoden ( eventhandler - also wie oben gesagt z. b. "onGuildMessageReceived( GuildMessageReceivedEvent event ) "). Nun möchte ich nicht in jeder Methode prüfen ob die Settings schon gelesen wurden und zur not dann das Objekt initialisieren. Ich würde sowas gerne nur einmal pro klasse machen - habe aber keine Ahnung wie.
Ist das irgendwie möglich? ( und ist mein Anliegen überhaupt verständlich? )
Edit:
Bzw. Kann ich dann das Settings Objekt irgendwie, wenn es ein Mal durch irgend eine der oben beschriebenen ListenerKlassen initialisiert wurde, an die anderen Listenerklassen verteilen? Ist das möglich?
Ich möchte halt vermeiden, dass in jeder Methode am Anfang steht
Eine Methode ist immer so aufgebaut:
Um es Grundlegend mal aufzuzeigen, wie der Bot aufgebaut ist:
ich hoffe durch das Coding ist es etwas klarer geworden, was das problem sein könnte...
sonst müsste ich tatsächlich, wie oben beschrieben jede Methode mit dem Singleton ausstatten ... das ist jetzt nicht wirklich schön ..
ich stecke leider gerade etwas in der Klemme, bzw. weiß nicht weiter.
Ich habe jetzt seit knapp 2 Jahren kein Java mehr gemacht und versuche wieder rein zu kommen, indem ich einen Bot für Discord entwickle.
Wer schon mal einen Bot für Discord entwickelt hat, weiß dass dort alles über Listener und Events funktioniert. ( z. B. onGuildMessageReceived - wird aufgerufen wenn im Server eine Nachricht gesandt wurde ) Und da es sehr viele Events gibt, habe ich diese anhand von "Kategorien" in Klassen geordnet ( z. B. alle "onGuildMessageXXX" Methoden in eine Klasse, alle "onGuildMemberXXX" in eine Klasse usw. ).
Nun ist es so, dass ich auch verschiedene einstellungen habe, welche sich von Server zu Server unterscheiden ( können ). Dafür habe ich eine Settings-Klasse. Diese habe ich als Singleton konzipiert, sodass nicht jedes Mal, wenn die eine Klasse einstellungen braucht, diese neu aus config Files oder so gelesen werden müssen. ( zur Info am Rande, diese Klasse enthält eine HashMap in der die Objekte als Values und die ServerID als Key gespeichert sind - Wichtig ist hier also die ServerID, dass mir diese immer zur verfügung steht).
Mein Problem jetzt, ist es, dass ich im Konstruktor der jeweiligen Klassen die ServerID nicht zur verfügung habe, diese bekomme ich immer erst durch die Methoden ( eventhandler - also wie oben gesagt z. b. "onGuildMessageReceived( GuildMessageReceivedEvent event ) "). Nun möchte ich nicht in jeder Methode prüfen ob die Settings schon gelesen wurden und zur not dann das Objekt initialisieren. Ich würde sowas gerne nur einmal pro klasse machen - habe aber keine Ahnung wie.
Ist das irgendwie möglich? ( und ist mein Anliegen überhaupt verständlich? )
Edit:
Bzw. Kann ich dann das Settings Objekt irgendwie, wenn es ein Mal durch irgend eine der oben beschriebenen ListenerKlassen initialisiert wurde, an die anderen Listenerklassen verteilen? Ist das möglich?
Ich möchte halt vermeiden, dass in jeder Methode am Anfang steht
Java:
this.settings = settings.get_instance(event.getGuild().getID());
Eine Methode ist immer so aufgebaut:
Java:
public void onGuildMessageUpdate(GuildMessageUpdateEvent event) {
}
Um es Grundlegend mal aufzuzeigen, wie der Bot aufgebaut ist:
Java:
public class APP {
public static void main(String[] args){
JDABuilder builder = new JDABuilder(AccountType.BOT);
// some stuff
builder.addEventListener(new GuildMessageListener() );
// add other listeners
}
}
public class GuildMessageListener extends ListenerAdapter {
private Settings settings;
public void onGuildMessageReveived(GuildMessageReceivedEvent event) {
// do stuff
}
// other event methods
}
ich hoffe durch das Coding ist es etwas klarer geworden, was das problem sein könnte...
sonst müsste ich tatsächlich, wie oben beschrieben jede Methode mit dem Singleton ausstatten ... das ist jetzt nicht wirklich schön ..
Zuletzt bearbeitet: