Fragen zu Variablennamen

Status
Nicht offen für weitere Antworten.
A

Anonym

Gast
Fragen zu Variablennamen

Hier sind die Antworten auf einige Fragen zu Variablennamen, die in ähnlicher Form immer wieder gestellt werden:

  1. Wie kann man Variablennamen nummerieren?
  2. Wie kann man "variable Variablennamen" vergeben?
  3. Wie kann man den Variablennamen zu einem gegebenen Objekt herausfinden?


Wie kann man Variablennamen nummerieren?

Wenn man viele Objekte erstellen will, und diese Objekte über Variablennamen ansprechen möchte, werden die Variablennamen oft einfach direkt durchnummeriert:
Java:
String vorname0 = "Foo";
String vorname1 = "Bar";
String vorname2 = "Foobar";
String vorname3 = "Barfoo";
String vorname4 = "Far";
String vorname5 = "Boo";
...
Das ist sehr unflexibel, bläht den Code auf und ist sehr schlecht erweiterbar. Zusätzlich hat man dann das Problem, dass man häufig einen Index (eine Nummer) hat, und dan dazu passenden Variablennamen benötigt:
Java:
public String getVorname(int index)
{
    return vorname-->hier den 'index' einsetzen<--;
}
Letzteres ist in dieser Form in Java nicht möglich. (Im Gegensatz zu PHP, wo man Variablennamen in dieser Form "zusammenbauen" kann). Den Index mit 'switch' oder einer 'if'-Abfrage zu überprüfen, und den passenden Vornamen zurückzugeben ist hier keine Abhilfe, sondern verschlimmert den Code nur.



Im einfachsten Fall: Mit einem Array

In den meisten Fällen ist die Lösung für dieses Problem ein einfacher Array. Dieser Array kann direkt bei der Erstellung oder mit einzelnen Anweisungen mit den passenden Daten gefüllt werden:
Java:
String vornamen[] = new String[] { "Foo", "Bar", "Foobar", "Barfoo", "Far", "Boo" };
oder
Java:
String vornamen[] = new String[6];
vornamen[0] = "Foo";
vornamen[1] = "Bar";
vornamen[2] = "Foobar";
...

Alle Vornamen mit einer for-Schleife zu durchlaufen, oder mit einem Index auf einen einzelnen Vornamen zuzugreifen ist damit ganz einfach:
Java:
public String getVorname(int index)
{
    return vorname[index];
}

Weitere Informationen zur Verwendung von Arrays findet man in allen gängigen Tutorials, zum Beispiel dem online verfügbaren Buch Java ist auch eine Insel, und dort im Kapitel 3.9: Arrays. Alternativ dazu kann man sich auch das Kapitel über Arrays aus dem Java-Grundlagentutorial von Sun ansehen.



Im komplizierteren Fall: Auch mit einem Array

Wenn man mehrere Daten hat, die zusammen gehören, sieht man häufig Code wie diesen:
Java:
String vorname0 = "Foo";
String nachname0 = "Oof";
int punktestand0 = "123";

String vorname1 = "Bar";
String nachname1 = "Rab";
int punktestand1 = "456";

String vorname2 = "Foobar";
String nachname2 = "Raboof";
int punktestand2 = "789";
....

Das könnte einen dazu verleiten, mehrere Arrays zu erstellen:
Java:
String vornamen[] = new String[6];
String nachname[] = new String[6];
String punktestaende[] = new int[6];
...
Allerdings ist diese Lösung wiederum sehr unübersichtlich, fehleranfällig und schlecht erweiterbar.


Stattdessen sollte man in Erwägung ziehen, eine Klasse "Datensatz" zu erstellen, die alle Informationen zusammenfasst:
Java:
class Datensatz
{
    private String vorname;
    private String nachname;
    private int punktestand;

    public Datensatz(String vorname, String nachname, int punktestand)
    {
         this.vorname = vorname;
         this.nachname = nachname;
         this.punktestand = punktestand;
    }

    // Get-Methoden für alle Daten:
    public String getVorname() { return vorname; }
    public String getNachname() { return nachname; }
    public int getPunktestand() { return punktestand; }

    // Set-Methoden - NUR für die Daten, die nachträglich geändert werden können!
    public void setPunktestand(int punktestand) { this.punktestand = punktestand; }
}

Dann mann man die Daten wieder in einem Array ablegen, der dann 'Datensatz'-Objekte enthält:
Java:
Datensatz datensaetze[] = new Datensatz[6];
datensaetze[0] = new Datensatz("Foo", "Oof", 123);
datensaetze[1] = new Datensatz("Bar", "Rab", 456);
datensaetze[2] = new Datensatz("Foobar", "Raboof", 789);

// Nachname aus dem Datensatz 1 lesen:
String nachname = datensaetze[1].getNachname();

// Punktestand für den Datensatz 2 setzen:
datensaetze[2].setPunktestand(666);

Hier noch einmal der Hiweis auf die entsprechenden Kapitel 3.9: Arrays aus dem Buch Java ist auch eine Insel, und das Kapitel über Arrays aus dem Java-Grundlagentutorial von Sun.



Wenn man die Anzahl der Variablen nicht kennt: Mit einer List

Wenn man die Anzahl der benötigten Variablen vorher nicht kennt, sollte man keinen Array verwenden, sondern eine List:
Java:
import java.util.List;
import java.util.ArrayList;
...

List<Datensatz> datensaetze = new ArrayList<Datensatz>();
datensaetze.add(new Datensatz("Foo", "Oof", 123));
datensaetze.add(new Datensatz("Bar", "Rab", 456));
datensaetze.add(new Datensatz("Foobar", "Raboof", 789));
...
//.... hier können beliebig viele weitere Datensätze hinzugefügt werden

Auf die einzelnen Elemente der Liste kann man dann mit der 'get'-Methode zugreifen:
Java:
// Nachname aus dem Datensatz 1 lesen:
String nachname = datensaetze.get(1).getNachname();

// Punktestand für den Datensatz 2 setzen:
datensaetze.get(2).setPunktestand(666);


Listen gehören zu einer Menge von Klassen, die man allgemein als "Collections" bezeichnet. Es gibt verschiedene Collections und Listen-Typen, die für verschiedene Aufgaben unterschiedlich gut geeignet sind. Wer mehr über diese Klassen erfahren will, kann sich im Buch Java ist auch eine Insel das Kapitel 12: Datenstrukturen und Algorithmen, oder spziell das Kapitel 12.3: Listen durchlesen. Zusätzlich gibt es natürlich von Sun auch ein Tutorial zu Collections und ein Tutorial zu Listen.




Wie kann man "variable Variablennamen" vergeben?

Manchmal kann man die Objekte, die erstellt werden, nicht einfach durchnummerieren. Zum Beispiel wenn die Namen der Objekte vom Benutzer vergeben werden sollen, und man später über diesen Namen wieder auf die Objekte zugreifen können will.

Java:
void eingabe()
{
    String objektname = lassDenBenutzerEinenNamenMitDerTastaturEintippen();

    Datensatz datensatz = new Datensatz("Foo", "Oof",  123);

    //--- Wie kann man hier den 'datensatz' unter dem eingegebenen 'objektnamen' abspeichern?
}

void abfragen()
{
    String objektname = lassDenBenutzerEinenNamenMitDerTastaturEintippen();
     
     //--- Wie kommt man hier an den 'datensatz' der zum eingegebenen 'objektnamen' passt?
}


"Variable Variablennamen" vergibt man mit einer Map

In diesem Fall kann man die Daten in einer Map ablegen. Eine Map bildet einen Schlüssel (den 'objektnamen') auf einen Wert (den 'datensatz') ab. Man kann dann also mit Hilfe des 'objektnamens' auf den 'datensatz' zugreifen:

Java:
// Eine Map, die Strings ('objektname') abbildet auf Objekte vom Typ 'Datensatz':
private Map<String, Datensatz> datenMap = new HashMap<String, Datensatz>();

void eingabe()
{
    String objektname = lassDenBenutzerEinenNamenMitDerTastaturEintippen();

    Datensatz datensatz = new Datensatz("Foo", "Oof",  123);
 
    // Daten in die Map legen:
    datenMap.put(objektname, datensatz);
}

void abfragen()
{
    String objektname = lassDenBenutzerEinenNamenMitDerTastaturEintippen();

    // Daten für den gegebenen Namen aus der Map holen:     
    Datensatz datensatz = datenMap.get(objektname);

    // Falls für den gegebenen Namen ein Objekt gefunden wurde, kann man damit arbeiten:    
    if (datensatz != null)
    {
        System.out.println(datensatz.getVorname());
    }
}

Maps werden im Buch Java ist auch eine Insel im Kapitel 12.8: Assoziative Speicher näher erklärt. Weitere Informationen findet man auch im Tutorial über Maps von Sun.





Wie kann man den Variablennamen zu einem gegebenen Objekt herausfinden?

Manchmal wird auch nach der umgekehrten Richtung gefragt: Wie kann man den Namen der Variablen herausfinden, der ein bestimmtes Objekt zugeordnet ist?

Java:
Daten meineDaten = new Daten();
Daten deineDaten = new Daten();
Daten seineDaten = new Daten();
...
Daten irgendwelcheDaten = meineDaten;
String name = holeNamen(irgendwelcheDaten); // Soll den String "meineDaten" liefern

Man kann die Variablennamen nicht abfragen! :wink:

So ein "Abfragen des Variablennamens" ist nicht möglich. Der Grund dafür ist schon allein der, dass ein Objekt ja unter verschiedenen Variablennamen bekannt sein kann.

Wenn man vor dem Problem steht, dass man sich den Namen einer Variablen holen will, gibt es mehrere Möglichkeiten:
1. Man ist Anfänger, und hat einige Programmiergrundlagen noch nicht verstanden
2. Man ist Anfänger, und will etwas besonders trickreich-kreatives machen
3. Man weiß, was man tun will, aber weiß nicht, wie es geht

Für alle diese Fälle gibt es aber eine Lösung:

zu 1.: Man sollte ein Grundlagenbuch lesen, wie etwa Java ist auch eine Insel

zu 2.: Man sollte (hier im Forum) genau beschreiben, was man machen will.
Dann bekommt man sicher einen Hinweis, wie man das gewünschte erreichen kann, ohne Variablennamen in dieser Form abfragen können zu müssen. Häufig kann man das vermutlich mit einer Map lösen, aber wie genau diese Map eingesetzt werden muss, ist vom konketen Ziel abhängig.

zu 3.: Dieser Punkt hätte auch lauten können: "Man will Reflection verwenden, kennt aber das reflection-Package nicht" :wink:
Wenn man den Namen eines Fields erhalten will, kann man dafür die Klassen aus dem java.lang.reflect Package verwenden. Damit kann man z.B. die Namen aller Fields einer Klasse auflisten. Das wird aber nur sehr selten und in sehr speziellen Zusammenhängen verwendet. Wer sich dafür interessiert, kann sich das Reflection-Tutorial von Sun ansehen, oder das sehr umfangreiche Kapitel 23: Reflection und Annotationen aus dem Buch Java ist auch eine Insel.

* Autor der Redaktion bekannt
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben