Methodennamen aus Variablen zusammensetzen?

Reaver1988

Mitglied
Hi,

ich habe eine Frage. Ist es generell Möglich mit Java Methodennamen, die sich widerholen, aber im Namen nur an einer Stelle ende, per Variable in einer For- Schleife zu erzeugen/verwenden?
Folgende Problematik vor der ich stehe (möchte meinen Code gerne schlank halten):
Es gibt ein Array, dass mit folgenden Daten gefüllt ist:
1: GebDatPers1
NamePers1
2: GebDatPers2
NamePers2
3: GebDatPers3
NamePers3
.
.
.
9: GebDatPers9
NamePers9

Es kann 0-9 personen in diesem Array geben. Diese Werte aus den Arrays sollen in ein Formular eingetragen werden, wo entsprechende Felder vorhanden sind.
Ich hole mir aus dem Formular also die Felder:
getGebDat1()
getGebDat2()
getGebDat3()
.
.
.
getGebDat9()

&
getName1()
getName2()
getName3()
.
.
.
getName9()

Klar könnte ich jetzt 9 Abfragen machen wenn ich das Array durchlaufe, aber bevor ich das mache, würde ich gerne wissen, ob ich Methodennamen dynamisch "generieren" kann? Mit Variablen geht es ja, indem man diese in ein Array packt und dann das Array anspricht. Ich habe das so mit der Methode probiert und wie zu erwarten war klappt es nicht


Java:
private void vorbelegPerson() {

        PERS_GEB[] persGeb = new PERS_GEB[9];
        persGeb = irgendwoher.getPERS_GEB();//Array in dem alles drinnen steht
        String[] PersGebdat = new String[9];
        for (int i = 0; i < PersGebdat.length; i++) {
            PersGebdat[i] = "getPersGebdat" + i;
        }
        String[] persName = new String[9];
        for (int i = 0; i < persName.length; i++) {
            persName[i] = "getPersName" + i;
        }
        for (int i = 0; i < persGeb.length; i++) {
            //Formular.getPersGebdat1.setValueAsString(persGeb[i].getPERS_GEB_DAT());
            Formular.persGebDat[i]().setValueAsString(persGeb[i].getPERS_GEB_DAT());
            //Formular.getPersName1.setValueAsString(persGeb[i].getPERS_NAME());
            Formular.persName[i]().setValueAsString(persGeb[i].getPERS_NAME());
        }
    }
Dort sieht man was ich gemacht habe und eventuell sieht man damit auch was ich vor habe. Ist dieses technisch irgendwie möglich?
Hoffe ich blamiere mich jetzt nicht total mit dieser Frage, aber ich denke soetwas wird man öfters brauchen können und bin zuversichtlich, dass es da eine Lösung des problemes gibt.
 
Meinst du das so:
Java:
String[] PersGebdatFormular = new String[9];
       
            PersGebdatFormular[0] = Formular.getPersGebdatFeld1;
            PersGebdatFormular[1] = Formular.getPersGebdatFeld2;
            PersGebdatFormular[2] = Formular.getPersGebdatFeld3;
            PersGebdatFormular[3] = Formular.getPersGebdatFeld4;
            PersGebdatFormular[4] = Formular.getPersGebdatFeld5;
            PersGebdatFormular[5] = Formular.getPersGebdatFeld6;
            PersGebdatFormular[6] = Formular.getPersGebdatFeld7;
            PersGebdatFormular[7] = Formular.getPersGebdatFeld8;
            PersGebdatFormular[8] = Formular.getPersGebdatFeld9;

Oder habe ich dich da falsch verstanden? Das wäre dann der gleiche Aufwand, als wenn ich das direkt in den oben geposteten abschnitt reinschreibe. Aber ich gehe einfach davon aus, dass ich das falsch verstanden habe 🙂
 
Ich meine, in der Formular-Klasse selbst hast du nicht 10 Variablen für die 10 Felder, sondern nur ein Array[10], in dem die Feld-Objekte abgespeichert sind. Dann könntest du einfach per Index auf jedes einzelne Feld zugreifen.
 
Schade. Theoretisch könnte man Reflection benutzen, um Methodennamen "zusammenzubauen". Davon würde ich hier aber abraten. Schreib halt alle Methodenaufrufe von 0-9 aus. Du kannst dir auch eine Hilfsmethode [c]getGebDat(int ndex)[/c] definieren, die abhängig vom übergebenem Index die richtige Variable zurück liefert (switch-Statement).
 
:autsch:
Seltsame Aufgabenstellung...
Ich denke, damit wirst du nicht weit kommen, soweit ich weiß, ist das nicht mal mit reflections möglich.
Besser wäre ein
Code:
getGebDat(int i)
aber wieso das nicht erlaubt sein soll, frag ich mich.

@tfa, wenn der Aufgabensteller schon so ne dumme Aufgabe stellt, kann man auch auf Reflections zugreifen.

Also um das klarzustellen:
Die Methoden musst du einzeln erstellen, das geht nicht mit Reflections (soweit ich weiß).
Aber deine Abfrage kannst du mit Reflections erheblich vereinfachen.
 
Also wie gesagt, Reflections machen so einiges möglich. Änderungen am Code wirken sich dann natürlich fatal aus und der alte Zustand ist, wenn man unvorsichtig ist, nicht reproduzierbar... Also mit Vorsicht genießen!

Java:
import java.lang.reflect.Method;


public class A {
	
	public static void main(String... arg) throws Exception {
		A a = new A();
		String methodPrefix = "do";
		Method[] methods = A.class.getDeclaredMethods();
		for( Method m : methods ) {
			if( m.getName().startsWith( methodPrefix ) ) {
				// do something with Method!
				m.invoke( a );
			}
		}
	}
	
	public void do1() {
		System.out.println( "One" );
	}
	
	public void do2() {
		System.out.println( "Two" );
	}
	
	public void do3() {
		System.out.println( "Three" );
	}
}
 
Ich glaube das ist dann doch etwas heikel. Werde ersteinmal die Teile einzeln ausschreiben(sind ja insgesamt auch nur knappe 80 zeilen, für eigentlich fast garnichts ^^) und dann den Vorschlag machen die Felder in der Formularklasse in ein Array zu packen, damit man damit arbeiten kann.
 
Eine kurze Zwischenfrage, wie kann ich überprüfen, ob ein Feld in einem Array vorhanden ist?
In dem oben genannten Array können immer unterschiedliche Informationen stehen. Wenn z.B. ein Name übergeben wurde(aus den Schritten die vorher passiert sind), dann steht er drinnen und kann mit getName geholt werden, hat man in den Schritten vorher keinen namen angegeben, so steht auch kein feld mit namen(auch nicht leer!) in dem array und das getName erzeugt ein Nullpointer (logisch, da ist ja auch nichts). Wie fange ich solche Fälle ab?

€: ich habe eine passend(selbstgeschriebene) methode zum überprüfen gefunden 🙂
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben