Klassennamen zum Aufruf eines statischen Feldes aus Variable holen

HeimCoder

Neues Mitglied
Hallo zusammen.

Ich bin neu hier, programmiere aber schon eine Weile in Java. Gerade ist mir eine Sache in den Sinn gekommen, die ich nicht lösen kann. Google gibt hier auch keine wirkliche Antwort, wenigstens nicht auf meine Suchbegriffe.

Ich möchte gerne eine statische Variable aus einer Klasse abfragen. Da ich das in mehreren Klassen habe und ich nicht immer alles mögliche nue schreiben möchte, frage ich mich gerade, ob ich nicht den Klassennamen aus einer Variablen herauslesen kann.

Vielleicht verdeutlicht ein wenig Code es besser, als es meine Worte tun:

Java:
public class KlasseMitWertA {
public static final String WERT = "A";
}

Java:
public class KlasseMitWertB {
public static final String WERT = "B";
}

Java:
public class BenutzeWertA {
String eigenerWert = KlasseMitWertA.WERT;
}

Java:
public class BenutzeWertB {
String eigenerWert = KlasseMitWertB.WERT;
}

Es werden immer mehr Klassen, die ich aus der Reihe "KlasseMitWertXY" brauche. Ich würde gerne darum herum kommen, für jede dieser neuen Klassen eine weitere Klasse "BenutzeWertXY" zu schreiben, vor allem, weil die recht komplex sind. Es ist bis jetzt jedesmal ein Copy/Past Wust, den ich dann im Nachhinein an den entsprechenden Stellen bearbeite.

Die eigentliche Frage ist: Wie bekomme ich eine generische Klasse "BenutzeWert" hin, die irgendwie auf die entsprechenden anderen Klassen "KlasseMitWertDingbums" zugreift?

Meine Idee ist nun, den Namen der KlasseMitWert als Variable zu übergeben, aber dann würde der Aufruf so aussehen:

Java:
String wert = variableMitDemKlassennamen.WERT;

Any idears?

Dank schon jetzt.
 
Hm, interessante Frage. Eine Variable mit dem Klassennamen könnte höchstens vom Typ "Class" sein, aber da alles static ist, kommt man mit der Class-Instanz nicht weiter. Man könnte dann Reflection benutzen und über den String "WERT" auf die Klassenvariable zugreifen, aber Reflection sollte man eigentlich vermeiden.

Kommen evtl. Annotations für dich infrage? Damit könnte man das so machen:

Java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface Wert {
    String value();
}

@Wert("WertVonA")
class A {
}

@Wert("WertVonB")
class B {
}

public class Inter {
    public static void test(Class c) {
        if(c.isAnnotationPresent(Wert.class)) {
            Wert wert = (Wert) c.getAnnotation(Wert.class);
            System.out.println(wert.value());
        }
    }

    public static void main(String[] args) {
        test(A.class); // gibt "WertVonA" aus
    }
}
 
Zuletzt bearbeitet:
Hallo rme.

Danke für deine Antwort. Da ich unter zeitdruck stehe, kann ich mir aktuell die Sache nicht weiter ansehen. Ich werde sie aber weiter verfolgen, sobald ich die Gelegenheit dazu habe.
 
Ist ein klarer Fall für Reflection.

Lies den statischen Parameter per Reflection aus und lass dir dazu die entsprechende Class-Instanz geben. Alles andere wird nur unnötig kompliziert, was meiner Meinung nach noch mehr zu vermeiden gilt, als Reflection.
Reflection ist ja nur deswegen "böse", weil es nicht Typsicher ist und man über (fast) alle Sichtbarkeits-Grenzen hinweg navigieren kann. Wenn man aber die Methode für diesen Fall richtig schreibt und eben prüft ob der Wert a) vorhanden und b) public und c) vom richtigen Typ ist, dann sollte nichts schief gehen. Wenn einer der Bedingungen nicht erfüllt ist, einfach ne "IllegalArgumentException" werfen und gut is. 😉

Zu überlegen wär auch, ob man diese Werte wirklich statisch sein müssen und man nicht mit einem Interface besser bedient wäre. Aber dafür weiß ich zu wenig über die Nutzung deiner Werte.
 
Reflection ist hauptsächlich böse, weil man mit Strings arbeiten muss. Wenn man die Klassenvariable mal via Tool umbennent, wird der String nicht von den Tools berücksichtigt und alles geht kaputt. Außerdem ist es ineffizient. Ich vermeide Reflection überall und hab noch keinen Fall gefunden, wo man es wirklich benötigen würde.
 

Zurück
Oben