Java Verkettte Aufrufe mittels Stringelemente

abraxus14

Cadet 4th Year
Registriert
Mai 2007
Beiträge
102
Hallo Mitglieder,

ich möchte eine Methode namens print() aufrufen, diese soll aber in unterschiedlich verschachtelten Objekten aufgerufen werden.

Ich mach das am besten an einem Beispiel klar:
Punkt p=new Punkt();
In der Klasse Punkt, gibt es eine Variable des Typs Punkt mit dem Variablennamen nächster.
also Punkt nächster;

Somit sind folgende Konstruktionen alle vom Typ Punkt:
p.print();
p.nächster.print();
p.nächster.nächster.print()
p.nächster.nächster.nächster.print();
usw.
Wie kann ich eine Schleife erstellen, die alle diese Methoden erreicht?
dabei möchte ich String a="nächster";
in die Schleife einbauen.

Vielen Dank für die Hilfe!
 
Code:
while( p != null )
{
  p.print();
  p = p.nächster;
}
Du musst halt nur daran denken p.nächster null zu setzen oder irgendetwas.
 
Code:
Punkt tmp = p;
while (tmp != null) {
  // dein code hier
  tmp = tmp.nächster;
}
 
Also Yuuris Code hat eventuelle Nachteile (Seiteneffekte, Variable p wird verändert), r0b0ts Code nen minimalen Tippfehler [den er kommentarlos wegeditiert hat...]

besser:
Code:
Punkt tmp = p;
while (tmp != null) {
  // dein code hier
  tmp = tmp.nächster;
}
 
Zuletzt bearbeitet:
ah gut ...danke für die Antworten.
Aber mithilfe von String a="nächster" kann ich keine Befehle basteln, oder??
 
Probiers mal mit

a += "nächster";

Normalerweise macht man sowas aber mit dem StringBuffer.
 
Er möchte sich anscheinend die Befehle in der Schleife selbst zusammenbauen...nur das gibts bei java nich ^^

schleife 0 - 0x "nächster" -> p.print()
schleife 1 - 1x "nächster" -> p."nächster".print()

nur das geht so nicht - nimm die Versionen von denen Oben.

da p.nächster vermutlich immer auf NULL initialisiert wird (es sei denn es is ne Zyklische Liste?) dann gehts einfach mit

while (p != null){
p.print();
p = p.nächster;
}
 
Ich verstehe nicht so ganz was du erreichen willst. soll das "nächster" einfach zwischendrin ausgegeben werden? oder willst du den nächsten punkt ausgeben, wenn man irgendwo nächster eingibt?
 
ja das Ziel ist das gleiche wie oben, nur das man den Befehl:
p.nächster.nächster.nächster.print();

durch z.b.

p."a"."a" oder wie auch immer ersetzt.
wobei String a="nächster" ist.
Eine Schleife würde dann immer wieder ein a und den Punkt dazu setzen und letztendlich das ganze als Befehl verstehen.

Ich wollte nur wissen, ob solche Konstruktionen möglich sind.
Die oben genannten Antworten helfen mir auf jeden Fall weiter. Nur interessiert es mich,ob
man das ganze auch anders zusammenbasteln kann.
 
nope soweit ich weiß gibts das nicht dass du einen String in ein Command umwandeln kannst...
außerdem müsstest du den String sowieso in ner Schleife zusammenbauen -> es rennt aufs gleiche hinaus.

Wichtig nur ist: Wenn das eine Liste ist und du sie nachher noch verwenden willst, mach das ganze über eine Temp-Referenz. Denn wenn du bei p beim letzten Element bist hättest du sonst die Referenzen auf die vorherigen Elemente verloren -> die GC holt sie sich...
 
Zeroflow schrieb:
nope soweit ich weiß gibts das nicht dass du einen String in ein Command umwandeln kannst...
außerdem müsstest du den String sowieso in ner Schleife zusammenbauen -> es rennt aufs gleiche hinaus.

Wichtig nur ist: Wenn das eine Liste ist und du sie nachher noch verwenden willst, mach das ganze über eine Temp-Referenz. Denn wenn du bei p beim letzten Element bist hättest du sonst die Referenzen auf die vorherigen Elemente verloren -> die GC holt sie sich...

ja werde ich so machen.Danke.
 
Ok, so gehts:

Point.java:
Code:
public class Point {
    public Point nächster;
    public String name;
    
    public void print() {
        System.out.println(this.name);
    }
}
Test.java:
Code:
import java.lang.reflect.Field;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Point p = new Point();
        p.name = "first";
        Point p2 = new Point();
        p2.name = "second";
        p.nächster = p2;
        
        String attr = "nächster";
        Field field = null;
        try {
            field = Point.class.getField(attr);
        }
        catch (Exception e) {
            e.printStackTrace();
            return;
        }

        Point temp = p;
        while(temp != null) {
            temp.print();
            try {
                temp = (Point) field.get(temp);
            }
            catch (Exception e) {
                e.printStackTrace();
                return;
            }
        }    
    }
}
Ausgabe:
Code:
first
second
Man beachte: Exceptions so nicht handlen, das ist böse ;)
 
Zuletzt bearbeitet:
Und dennoch ist bei deinem Beispiel kein Aufruf à la p.attr.attr.print(); möglich...
Dass mit Hilfe von Reflection an zur Compilierzeit nicht feststehende Methoden und Attribute rangekommen werden kann ist ja nichts neues, aber den gewünschten Effekt erzielt man damit auch nicht...
 
Rein nur aus Interesse: aber welchen Nutzen erhoffst du dir denn davon? denn mehr als den Code zu verlängern macht das in deinem Fall nicht...

Auch sonst wäre es wsl einfacher die gültigen String-Eingaben händisch zu Filtern und dann den jeweiligen Command auszuführen.

Nur generell noch: Umlaute und ß in Java-Proggies sind eher schlecht da das Probleme geben kann.

entweder du schreibst naechster, oder nimmst alles immer auf Englisch...
 
@riDDi: Tolles Zitat, den wichtigen Teil einfach weggelassen...
Man muss kein Deutsch-Professor sein, um zu sehen, dass ein Satz, der mit "dabei" anfängt, sich irgendwie auf das bezieht, was mehr oder weniger unmittelbar davor steht...
Dass man Methoden irgendwie auflösen kann => klar geht
aber ein Aufruf nach dem genannten Schema geht nun mal nicht...
 
Warum denn so aggressiv?

Zitieren wir mal mehr:
Wie kann ich eine Schleife erstellen, die alle diese Methoden erreicht?
dabei möchte ich String a="nächster";
in die Schleife einbauen.
Schleife, die alle Methoden erreicht - check
String "nächster" in der Schleife - check
Mehr war nicht gefragt. Es war nie unbedingt die Rede davon aus einem String einen verketteten Aufruf zu generieren, auch wenn das gegen alle Unkenrufe hier prinzipiell möglich, wenn auch unnötig kompliziert wäre und sicher nicht der Sinn der Reflection-API ist.
 
Zuletzt bearbeitet:
Zurück
Oben