Referenz auf Klasse als Rückgabewert

iTobi97

Aktives Mitglied
Hallo liebe Community,
ich versuche gerade eine Referenz auf die selbe Klasse als Rückgabewert einer Methode zu verwenden. Diese Methode ist mit Objekten ja relativ einfach:
Code:
public TestKlasse setA(A a) {
this.a = a;
return this;
}
Sodass ich später den Code wie folgt verwenden kann:
Code:
Testklasse testklasse = new Testklasse();
testklasse.setA("abc").setB("bcd").setC("cde"); //usw

Nach dem gleichen Prinzip habe ich das selbe versucht, allerdings mit statischen Methoden (mit welchen ich auch wieder statische Attribute setze):

Code:
public static Class setGUI(GUI gui){
        creationGui = gui;
        return ActionHandler.class;
}

Kann mir jemand kurz sagen, was ich da falsch mache, bzw. wo ich den Logikfehler habe?

Viele Grüße
 

httpdigest

Top Contributor
Dein Ansatz:
- Zugriff auf Instanzfelder einer Instanz einer Klasse sollte möglich sein (ist ja auch)
- somit sollten Zugriffe auf statische Felder einer Klasse, also Instanz von java.lang.Class, auch möglich sein (ist es leider nicht, bzw. nur per Reflection)
erscheint zwar nachvollziehbar als logisch, funktioniert aber in Java leider nicht.
Das liegt daran, dass zwar ein Objekt eine Instanz einer Klasse etwa "Testklasse" ist, aber eine Klasse selbst nur zum Zwecke der Laufzeit-Reflection eine Instanz der allgemeinen java.lang.Class Klasse ist.
Wenn du also java.lang.Class zurücklieferst, weiß der Compiler leider nicht mehr, was das statisch für eine Klasse war und welche Felder sie hatte, um dann darauf zuzugreifen.
Das heißt, der Ausdruck ActionHandler.someStaticField ist zwar gültig, aber nicht ((Class)theActionHandlerClass).someStaticField. Auch nicht, wenn du z.B. Generics verwendest, um dem Compiler zu sagen, dass die Class eigentlich eine Class<ActionHandler> war.
Und der Grund ist, dass hier eine gewisse Mehrdeutigkeit vorliegt: Java weiß hier nicht, ob du nun eigentlich auf ein statisches Feld der gemeinten Klasse (also dem Laufzeittyp des zugegriffenen Class-Objektes) zugreifen möchtest, oder aber, ob du auf ein "Instanzfeld" oder Methode des java.lang.Class Objektes selbst (was ja Teil der Reflection API ist) zugreifen wolltest.
Java nimmt hier das letztere an, und du kannst z.B. ((Class)theActionHandlerClass).getField("someStaticField").get(null) machen, um lesend auf das Feld "someStaticField" zuzugreifen.
Also, in Java bzw. der JVM müssen Zugriffe auf statische Klassenfelder immer mit dem ganz konkreten Klassentyp angegeben werden und nicht mit dem "Laufzeittyp" einer Variablen vom Typ java.lang.Class. Oder du greifst per Java Reflection API auf die Felder zu.
 

httpdigest

Top Contributor
Oder mit anderen Worten:
Es gibt den konzeptuellen Unterschied zwischen:
Java:
someExpression.a()
und:
Java:
SomeClass.a()
Im ersteren Fall findet ein virtueller (dynamic dispatch) Aufruf der Methode `a` auf dem Laufzeittyp des Objektes, welcher das Ergebnis des Ausdrucks `someExpression` ist, statt. a selbst muss hierbei natürlich auch auf dem statischen Typ des Ausdrucks existieren.
Im zweiten Fall sieht der Java Compiler, dass hier ganz explizit eine bekannte Klasse gemeint ist und es findet stattdessen ein statischer Methodenaufruf auf die statische Methode a() deklariert in SomeClass (oder Superklasse) statt.
Dein Fall mit dem Zurückgeben einer Instanz von java.lang.Class und dann Zugriff darauf ist der erstere Fall:
Java:
class SomeClass {
  static void a() {
    System.out.println("Hello!");
  }
}
Class giveClass() {
  return SomeClass.class;
}
void test() {
  Class clazz = giveClass();
  clazz.a(); // <- COMPILER ERROR! 'a' ist unbekannt.
}
Hier wird der Zugriff auf 'a' abgewiesen, da java.lang.Class keine solche Instanzmethode bereitstellt.
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn sowas nötig ist, ist es meistens sowieso schlechter Stil und wird besser anders gelöst ;)


Man kann aber "hacky" sein, und als Rückgabetyp den entsprechenden Typ angeben und null zurückgeben - darauf kann man dann die statischen Methode aufrufen - ist aber wirklich ein ziemlicher Hack...
 

iTobi97

Aktives Mitglied
@httpdigest Vielen Dank für die ausführliche Antwort. Ich hab irgendwie schon befürchtet, dass die Antwort nicht die einfachste ist. Ich habe bereits vermutet, dass man versuchen könnte, das Problem mit Reflections anzugehen.

@mrBrown Ich stimme dir völlig zu, dass das keine schöne Lösung ist, und eigentlich ziemlich schlechter Stil ist. Allerdings habe ich bis jetzt in meinem Code noch keine bessere Lösung gefunden.
In JavaFX hängt ja leider ziemlich viel von der Reihenfolge der Aufrufe und Deklarationen ab, und wenn das Eine Objekt das Andere im Konstruktor benötigt, und Das andere wiederum das Erste, hat man ein Problem ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Allerdings habe ich bis jetzt in meinem Code noch keine bessere Lösung gefunden.
In JavaFX hängt ja leider ziemlich viel von der Reihenfolge der Aufrufe und Deklarationen ab, und wenn das Eine Objekt das Andere im Konstruktor benötigt, und Das andere wiederum das Erste, hat man ein Problem ;)
Das ist aber nichts, wo man static einsetzen sollte, das macht es nur schlimmer ;)
JavaFX ist da jetzt auch nicht wirklich besonders? Wenn man solche zyklische Abhängigkeiten hat, hat man immer ein Problem, aber Wege ohne static gibt es trotzdem


Wenn du mal Code zeigst, kann man dir da sicher helfen ;)
 

iTobi97

Aktives Mitglied
@mrBrown Natürlich sind diese Fragen immer mit dem Code einfacher zu beantworten.
Allerdings darf ich das leider hier nicht machen, da viele Fragen im Zusammenhang mit meinem Studium auftreten, und wir aus urheberrechtlichen Gründen den Code nicht online zeigen dürfen. Daher muss ich die Fragen immer etwas umständlich umschreiben :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
F Referenz an ein Objekt in einer anderen Klasse erstellen(Nullpointer exception) Java Basics - Anfänger-Themen 6
C Referenz einer bereits instanziierten Klasse während des Programmablaufs Java Basics - Anfänger-Themen 16
D enum und Referenz der umgebenden Klasse Java Basics - Anfänger-Themen 2
Hzrfa Objekte, Referenz Java Basics - Anfänger-Themen 5
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
O Warum bekommen wir nicht die Referenz vom zurückgegebenen Objekt? Java Basics - Anfänger-Themen 4
C Kopie oder Referenz ? Java Basics - Anfänger-Themen 5
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
Y Pointer / Referenz - Theorie Java Basics - Anfänger-Themen 3
H Referenz Objekt aufrufen Java Basics - Anfänger-Themen 12
D Uebergabe per Referenz Java Basics - Anfänger-Themen 2
O Referenz - toString Java Basics - Anfänger-Themen 9
S This-Referenz Java Basics - Anfänger-Themen 6
P Datentypen LinkedList: Kopie behält Referenz? Java Basics - Anfänger-Themen 3
J Referenz und Instanzierung Java Basics - Anfänger-Themen 25
I Erste Schritte Referenz zum Knoten davor, in einer Liste Java Basics - Anfänger-Themen 4
M Referenz geht bei Zwischenspeichern verloren (ArrayList) Java Basics - Anfänger-Themen 4
8 Referenz (Pointer, Zeiger) in Java Java Basics - Anfänger-Themen 9
O This-Referenz als Returnwert einer Methode? Java Basics - Anfänger-Themen 13
O This Referenz Java Basics - Anfänger-Themen 3
A top referenz bei queues Java Basics - Anfänger-Themen 1
J Rückgabe als Wert, keine Referenz Java Basics - Anfänger-Themen 3
Q Parameterübergabe - Objekt - Referenz Java Basics - Anfänger-Themen 5
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
V Frage zu Polymorphismus: Objekt der Subklasse in Referenz der Oberklasse Java Basics - Anfänger-Themen 4
T Aufgerufene Methode Inhalt der übergebenen Referenz Java Basics - Anfänger-Themen 5
B Referenz in Java Java Basics - Anfänger-Themen 5
C Referenz auf ein Objekt kopieren! Java Basics - Anfänger-Themen 2
J Methoden Referenz und Speicherplatz für Objekte reservieren Java Basics - Anfänger-Themen 2
M Wie komm ich an die Referenz eines Oberflächenelements Java Basics - Anfänger-Themen 2
A Klassenvariablen Referenz auf ein Objekt Java Basics - Anfänger-Themen 18
M Referenz Frage Java Basics - Anfänger-Themen 12
K OOP Probleme mit Objekt-Referenz in Methode Java Basics - Anfänger-Themen 6
W Die leidige Referenz-Frage Java Basics - Anfänger-Themen 9
B Arraycopy kopiert nur die Referenz?! Java Basics - Anfänger-Themen 3
S Speicheradresse auf die eine Referenz zeigt ausgeben Java Basics - Anfänger-Themen 12
E Compiler-Fehler kann Objekt-Referenz nicht erstellen Java Basics - Anfänger-Themen 3
B Referenz zu anderen Frame Java Basics - Anfänger-Themen 10
Blackskyliner Referenz ähnlicher Zugriff, aber wie? Java Basics - Anfänger-Themen 4
K Klassen this-Referenz und Klassen/Methodenaufruf Syntax Java Basics - Anfänger-Themen 3
H Objekt holen per Referenz als String. Java Basics - Anfänger-Themen 4
T Referenz einer Variable übergeben Java Basics - Anfänger-Themen 3
S Datentypen Objekt Integer Referenz Java Basics - Anfänger-Themen 5
B Referenz auf Referenz Java Basics - Anfänger-Themen 3
Luk10 Problem mit Singleton bzw statischer Referenz! Java Basics - Anfänger-Themen 16
H ArrayList Zugriffe per Referenz verkürzen? Java Basics - Anfänger-Themen 9
B Static Referenz auf Non-static Feld Java Basics - Anfänger-Themen 6
Luk10 Sinn von Instanzierung ohne Referenz Java Basics - Anfänger-Themen 7
C0FFEE Referenz auf Methode übergeben Java Basics - Anfänger-Themen 2
aze NullpointerException :Null Referenz anzeigen lassen Java Basics - Anfänger-Themen 2
D Fehlen einer Referenz auf Objekt Java Basics - Anfänger-Themen 14
N this.referenz erläuterung Java Basics - Anfänger-Themen 2
K Attribut als Referenz auf Objekt Java Basics - Anfänger-Themen 8
K 3 Threads bearbeiten 1 Referenz: Ich versteh's nicht... Java Basics - Anfänger-Themen 2
P OOP-Theorie-Frage: Referenz auf Objekt Java Basics - Anfänger-Themen 27
D Referenz auf Objekt Java Basics - Anfänger-Themen 5
P Methode BigInteger-Array übergeben als Referenz Java Basics - Anfänger-Themen 6
U null-referenz Java Basics - Anfänger-Themen 26
deetee Problem mit Referenz auf Map Java Basics - Anfänger-Themen 5
G Interface referenz probleme Java Basics - Anfänger-Themen 10
V Return - JA/NEIN - Parameterübergabe Array (Referenz) Java Basics - Anfänger-Themen 7
C Referenz Java Basics - Anfänger-Themen 11
A ClassNotFoundException: Referenz nicht aktualisiert Java Basics - Anfänger-Themen 2
P Textarea aktualisieren, Referenz fehlt Java Basics - Anfänger-Themen 4
T Die this Referenz Java Basics - Anfänger-Themen 21
C Größe einer Referenz ? Java Basics - Anfänger-Themen 16
D Array reverse Problem, da Referenz nicht auf tmpArray zeigt Java Basics - Anfänger-Themen 4
G primitive Datentypen als Referenz an eine Methode übergeben Java Basics - Anfänger-Themen 2
G Wie Referenz auf Objekt übergebn Java Basics - Anfänger-Themen 8
P Objekte als Attribut: Referenz oder Kopie? Java Basics - Anfänger-Themen 3
G Parameterübergabe als Referenz bzw. als Kopie Java Basics - Anfänger-Themen 4
S Prüfen, ob null Referenz? Java Basics - Anfänger-Themen 2
G Referenz-Problem Java Basics - Anfänger-Themen 3
J Referenz problem Java Basics - Anfänger-Themen 12
D tiefergehende Java-Referenz Java Basics - Anfänger-Themen 3
M Referenz auf Membervariable Java Basics - Anfänger-Themen 5
G Objektübergabe als Referenz bei RMI Java Basics - Anfänger-Themen 2
J referenz auf noch nicht erzeugte objekte? Java Basics - Anfänger-Themen 2
G Rückgabe einer Kopie bzw. Referenz Java Basics - Anfänger-Themen 22
M Parameter als Referenz übergeben Java Basics - Anfänger-Themen 5
F Referenz Pointer oder doch nochmal neu suchen ? Java Basics - Anfänger-Themen 2
D Unterschied zwischen Referenz auf Objekt/Instanz von Objekt Java Basics - Anfänger-Themen 9
K Referenz auf Funktion Java Basics - Anfänger-Themen 6
J Referenz auf ein Objekt Java Basics - Anfänger-Themen 2
javasdann Referenz als String ausgeben. Java Basics - Anfänger-Themen 10
B Was ist eine Referenz? Java Basics - Anfänger-Themen 6
Z Zugriff auf Attribute nach Zuweisung einer Referenz Java Basics - Anfänger-Themen 8
L Referenz vs. Kopie Java Basics - Anfänger-Themen 2
G Zeiger/Referenz auf int- Variable Java Basics - Anfänger-Themen 5
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben