Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen

d.lumpi

Mitglied
Hallo, ich habe da mal wieder eine frage.
Java:
/*
es geht darum,
dass ich wieder einen Discord Bot mit JDA programmiere.
ich will, dass man,
wenn man im chat von discord 
!cmd shutdown schreibt, dass sich der bot dan ausschaltet.
*/
//so sieht das programm in der haupt-klasse aus, um den bot zu definieren.
public ShardManager shardMan;
    
    public DiscordBot1() throws LoginException, IllegalArgumentException {
        
        DefaultShardManagerBuilder builder = DefaultShardManagerBuilder.createDefault("ODIyNDA2OTI0OTU0NzYzMjY1.YFR0Ig.RI39P2jCog3KXht4L8RjFW0tuq8");
        
        builder.setActivity(Activity.playing("Bot 1 sein."));
        builder.setStatus(OnlineStatus.ONLINE);
        
        
        builder.addEventListeners(new CommandListener());
        
        shardMan = builder.build();
        System.out.println("Bot 1 online.");
        
        shutdown();
        
        
    }
//und so sieht der code aus, um ihn zu herunterfahren:
if(shardMan != null) {
                            shardMan.setStatus(OnlineStatus.OFFLINE);
                            shardMan.shutdown();
                            System.out.println("Bot 1 offline.");
                        }
//jetzt will ich, dass im eventlistener sobald man die nachricht !cmd shutdown empfängt, er sich herunterfährt. ich habe es so probiert, was aber nicht geht:
if(args[0].equalsIgnoreCase("shutdown")) {
                        ShardManager shardMan = DiscordBot1.shardMan(); // wobei DiscordBot1 meine klasse meint, in der der bot definiert wird...
                        shardMan.setStatus(OnlineStatus.OFFLINE);
                        shardMan.shutdown();
                        System.out.println("Bot 1 offline.");
                    }
//Kann mir bitte da wer helfen?
 
Also Du drückst Dich sehr unverständlich aus finde ich. So verstehe ich nicht wirklich, was Du willst.

Generell brauchst du eine Referenz auf eine Instanz, wenn Du auf diese zugreifen willst. Und wenn eine Instanz auf andere zugreifen können soll, dann wird der Instanz eine solche Referenz gegeben.

Wenn diese Referenz zwingend notwendig ist, dann bietet es sich an, diese Referenz z.B. im Konstruktor zu übergeben.

Was natürlich nicht gehen kann ist, dass man sich einfach ein neues Objekt erstellt. Das einfach mal bildlich beschrieben: Du hast eine Geldbörse und hast Da Dein Geld rein getan. Jetzt liegt die Geldbörse zuhause rum und du bist unterwegs. Also kaufst Du Dir einfach eine neue und erwartest, dass dann Dein Geld in der neuen Geldbörse erscheint dammit Du da dran kommst ...

Also wenn Du in CommandListener Zugriff auf shardMan brauchst, dann kannst Du die Instanz dem CommandListener übergeben. Dazu müsste der Konstruktor das als Parameter erwarten, im Konstruktor müsste es in einer Instanzvariable gespeichert werden und schon hättest Du im EventListener auch Zugriff drauf.

Evtl. bietet das Discord Framework auch irgendwelche anderen Wege um an ShardManager zu kommen, aber das wäre zumindest ein gangbarer Weg.

Generell scheint mir aber auch der shutdown() Aufruf etwas dubios. Denn laut Dokumentation ist die Funktion halt:
Shuts down all JDA shards, closing all their connections. After this method has been called the ShardManager instance can not be used anymore.

Aber das nur am Rande. Generell wäre meine Empfehlung, dass Du Dich erst einmal in Ruhe mit der Java Programmierung auseinander setzt. Denn dieses Discord Bot Basteln sehe ich nicht wirklich aus wirkliches Erlernen von Java, zumindest scheint es in meinen Augen untauglich, um sich damit Java bei zu bringen....

Edit: An einer Stelle hatte ich Minecraft erwähnt - das sollte natürlich Discord heißen und wurde verbessert ...
 

Zurück
Oben