[Spigot 1.17] Methode aus anderer Klasse verwenden?
Aktueller Code:
package Main;
public class API {
public static API instance;
public API(){
instance = this;
}
public static API getInstance(){
return instance;
}
public String getAPI(){
return "§cThis is an API";
}
}
In onEnable(){}:
API.getInstance().getAPI();
Fehler:
Error occurred while enabling ActionBarTimer v1.0 (Is it up to date?)
java.lang.NullPointerException: Cannot invoke "Main.API.getAPI()" because the return value of "Main.API.getInstance()" is null
Wie kann ich die Methode richtig aufrufen und warum sagt mir die Konsole was von null?
Und wie heißt das fachsprachlich, dass wenn man Methoden aus anderen Klassen verwendet?
Danke :)
3 Antworten
Dein Code sieht aus wie ein missglückter Versuch, ein Singleton zu kreieren. Eine solche Implementation müsste dann aber wie folgt aussehen:
public class Api {
private static Api instance;
protected Api() {
}
public static API getInstance() {
if (instance == null) {
instance = new Api();
}
return instance;
}
@Override
public String toString() {
return "§cThis is an API";
}
}
Weder Feld, noch Konstruktor sind von außen aufrufbar. Wenn du mit getAPI die Klasse beschreiben wolltest, wäre das Überschreiben der toString-Methode sinnvoller.
Und wie heißt d as fachsprachlich, dass wenn man Methoden aus anderen Klassen verwendet?
Methodenaufruf passt auch für diesen Fall.
Eine Singleton-Klasse (hier: Api) hat im gesamten Programm nur eine einzige Instanz. Deshalb wird der Konstruktor für äußeren Zugriff gesperrt (Sichtbarkeit protected oder private) und die getInstance-Methode übernimmt stattdessen das Anlegen (und Herausgeben). Das Feld instance speichert die angelegte Instanz. Wenn du getInstance mehrmals aufrufen würdest, wird nur beim allerersten Aufruf, wenn das Api-Objekt noch nicht existiert, eines angelegt und in instance gespeichert. In Folgeaufrufen kann anhand des Zustands von instance geprüft werden, ob es bereits eine Instanz gibt (die dann auch weiterverwendet wird) oder ob sie noch angelegt werden muss.
Die Variable instance ist nicht initialisiert. Du musst vorher den Konstruktor mit new API(); aufrufen, damit auch die Variable instance gesetzt wird. Dann macht es aber wenig Sinn die Funktionen und die Variable als static zu deklarieren, weil du ja sowieso eine Instanz von der Klasse API haben willst. Also alle "Static" weg und dann folgenden Code:
API api = new API();
api.getInstance().getAPI();
Ja natürlich. Aber dann macht die Instanz keinen Sinn. Du würdest ja dann jedes Mal eine neue Instanz erstellen, wenn du den Aufruf machst. Dann kannst du die Instanz variable auch ganz weg lassen und die ganze Klasse static machen
Beim Hovern über getZahl erscheint folgende Meldung:
Result of 'TimerAPI.getZahl()' is ignored
onEnable in Main.java:
TimerAPI timerapi = new TimerAPI();
timerapi.getZahl();
TimerAPI.java:
public class TimerAPI {
private int Zahl = 3;
public int getZahl(){
return Zahl;
}
Dieses Problem habe ich jetzt schon die ganze Zeit, ich habe es schon mit einem String (Natürlich eine anders aufgebaute Methode) anstelle von int versucht.
Wenn du mit der Zahl natürlich was anstellen willst, musst du das Ergebnis der Funktion "getZahl()" natürlich noch in einer variable speichern.
Also
int zahl = timerapi.getZahl();
Ich vermute Mal du bist noch neu im programmieren. Schau dir am besten Mal ein paar YouTube Videos zum Thema programmieren mit Java an. :)
Auch zum lernen helfen YouTube Videos. Ich hab auch damit angefangen und mir immer viel auf YouTube angeschaut und die Grundlagen zu verstehen
Was bedeutet instance eigentlich konkret? Außer jetzt die wörtliche Übersetzung.