Variablen benennen: Unterschied zwischen den Versionen
K |
K |
||
(5 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 11: | Zeile 11: | ||
== Wie kann man Variablennamen nummerieren? == | == 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: | Wenn man viele Objekte erstellen will, und diese Objekte über Variablennamen ansprechen möchte, werden die Variablennamen oft einfach direkt durchnummeriert: | ||
− | < | + | <syntaxhighlight lang="java"> |
String vorname0 = "Foo"; | String vorname0 = "Foo"; | ||
String vorname1 = "Bar"; | String vorname1 = "Bar"; | ||
Zeile 19: | Zeile 19: | ||
String vorname5 = "Boo"; | String vorname5 = "Boo"; | ||
... | ... | ||
− | </ | + | </syntaxhighlight> |
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: | 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: | ||
− | < | + | <syntaxhighlight lang="java"> |
public String getVorname(int index) | public String getVorname(int index) | ||
{ | { | ||
return vorname //-->hier den 'index' einsetzen<--; | return vorname //-->hier den 'index' einsetzen<--; | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
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. | 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. | ||
Zeile 33: | Zeile 33: | ||
=== Im einfachsten Fall: Mit einem Array === | === 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: | 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: | ||
− | < | + | <syntaxhighlight lang="java"> |
String[] vornamen = new String[] { "Foo", "Bar", "Foobar", "Barfoo", "Far", "Boo" }; | String[] vornamen = new String[] { "Foo", "Bar", "Foobar", "Barfoo", "Far", "Boo" }; | ||
− | </ | + | </syntaxhighlight> |
oder | oder | ||
− | < | + | <syntaxhighlight lang="java"> |
String[] vornamen = new String[6]; | String[] vornamen = new String[6]; | ||
vornamen[0] = "Foo"; | vornamen[0] = "Foo"; | ||
Zeile 45: | Zeile 45: | ||
vornamen[2] = "Foobar"; | vornamen[2] = "Foobar"; | ||
... | ... | ||
− | </ | + | </syntaxhighlight> |
Alle Vornamen mit einer for-Schleife zu durchlaufen, oder mit einem Index auf einen einzelnen Vornamen zuzugreifen ist damit ganz einfach: | Alle Vornamen mit einer for-Schleife zu durchlaufen, oder mit einem Index auf einen einzelnen Vornamen zuzugreifen ist damit ganz einfach: | ||
− | < | + | <syntaxhighlight lang="java"> |
public String getVorname(int index) | public String getVorname(int index) | ||
{ | { | ||
return vorname[index]; | return vorname[index]; | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
Weitere Informationen zur Verwendung von Arrays findet man in allen gängigen Tutorials, zum Beispiel dem online verfügbaren Buch [http://openbook.galileocomputing.de/javainsel/ Java ist auch eine Insel], und dort im [http://openbook.galileocomputing.de/javainsel/javainsel_03_008.html#dodtp9894e88c-16e7-4052-8cc7-1f947e09e784 Kapitel 3.8: Arrays]. Alternativ dazu kann man sich auch das [http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html Kapitel über Arrays] aus dem [http://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html Java-Grundlagentutorial] von Oracle (früher Sun) ansehen. | Weitere Informationen zur Verwendung von Arrays findet man in allen gängigen Tutorials, zum Beispiel dem online verfügbaren Buch [http://openbook.galileocomputing.de/javainsel/ Java ist auch eine Insel], und dort im [http://openbook.galileocomputing.de/javainsel/javainsel_03_008.html#dodtp9894e88c-16e7-4052-8cc7-1f947e09e784 Kapitel 3.8: Arrays]. Alternativ dazu kann man sich auch das [http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html Kapitel über Arrays] aus dem [http://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html Java-Grundlagentutorial] von Oracle (früher 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: | ||
+ | <syntaxhighlight lang="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"; | ||
+ | .... | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Das könnte einen dazu verleiten, mehrere Arrays zu erstellen: | ||
+ | <syntaxhighlight lang="java"> | ||
+ | String[] vornamen = new String[6]; | ||
+ | String[] nachname = new String[6]; | ||
+ | int[] punktestaende[]; = new int[6]; | ||
+ | ... | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 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: | ||
+ | <syntaxhighlight lang="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; } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Dann mann man die Daten wieder in einem Array ablegen, der dann 'Datensatz'-Objekte enthält: | ||
+ | <syntaxhighlight lang="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); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === 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: | ||
+ | <syntaxhighlight lang="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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Auf die einzelnen Elemente der Liste kann man dann mit der 'get'-Methode zugreifen: | ||
+ | <syntaxhighlight lang="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); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 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 [http://openbook.galileocomputing.de/javainsel/index.html Java ist auch eine Insel] das [http://openbook.galileocomputing.de/javainsel/javainsel_13_001.html#dodtpf016dc31-a49b-4fb1-a42e-c0f07375828b Kapitel 13: Datenstrukturen und Algorithmen], oder spziell das [http://openbook.galileocomputing.de/javainsel/javainsel_13_002.html#dodtp5e6355b5-c483-4ca9-92f6-7bb32314150d Kapitel 13.2: Listen] durchlesen. Zusätzlich gibt es natürlich von Oracle (früher Sun) auch ein [http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html Tutorial zu Collections] und ein [http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html 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. | ||
+ | <syntaxhighlight lang="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? | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === "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: | ||
+ | <syntaxhighlight lang="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()); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Maps werden im Buch [http://openbook.galileocomputing.de/javainsel/ Java ist auch eine Insel] im [http://openbook.galileocomputing.de/javainsel/javainsel_13_004.html#dodtp6da5370b-3e76-4c81-87c1-7c8d2c29c958 Kapitel 13.4: Assoziative Speicher] näher erklärt. Weitere Informationen findet man auch im [http://docs.oracle.com/javase/tutorial/collections/interfaces/map.html Tutorial über Maps] von Oracle (früher 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? | ||
+ | <syntaxhighlight lang="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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Man kann die Variablennamen nicht abfragen! ;) | ||
+ | |||
+ | 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 ([http://forum.byte-welt.net/ 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" | ||
+ | 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 [http://docs.oracle.com/javase/tutorial/reflect/index.html Reflection-Tutorial] von Oracle (früher Sun) ansehen, oder das sehr umfangreiche [http://openbook.galileocomputing.de/javainsel9/javainsel_25_001.htm Kapitel 25: Reflection und Annotationen] aus dem Buch [http://openbook.galileocomputing.de/javainsel9/ Java ist auch eine Insel]. | ||
+ | |||
+ | {{Fragen stellen}} | ||
− | |||
[[Kategorie:Java Grundlagen]] | [[Kategorie:Java Grundlagen]] | ||
[[Kategorie:Programmierung Grundlagen]] | [[Kategorie:Programmierung Grundlagen]] | ||
− | -- [[Benutzer:foobar | foobar]] 02.03.2008 | + | -- [[Benutzer:foobar | foobar]] 02.03.2008 | |
-- [[Benutzer:L-ectron-X | L-ectron-X]] 30.08.2013 (update) | -- [[Benutzer:L-ectron-X | L-ectron-X]] 30.08.2013 (update) |
Aktuelle Version vom 7. April 2018, 16:26 Uhr
Inhaltsverzeichnis
Benennung von Variablen
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:
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:
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:
String[] vornamen = new String[] { "Foo", "Bar", "Foobar", "Barfoo", "Far", "Boo" };
oder
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:
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.8: Arrays. Alternativ dazu kann man sich auch das Kapitel über Arrays aus dem Java-Grundlagentutorial von Oracle (früher 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:
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:
String[] vornamen = new String[6];
String[] nachname = new String[6];
int[] 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:
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:
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);
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:
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:
// 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 13: Datenstrukturen und Algorithmen, oder spziell das Kapitel 13.2: Listen durchlesen. Zusätzlich gibt es natürlich von Oracle (früher 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.
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:
// 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 13.4: Assoziative Speicher näher erklärt. Weitere Informationen findet man auch im Tutorial über Maps von Oracle (früher 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?
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! ;)
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" 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 Oracle (früher Sun) ansehen, oder das sehr umfangreiche Kapitel 25: Reflection und Annotationen aus dem Buch Java ist auch eine Insel.
Fragen
Das Thema wurde nicht ausreichend behandelt? Du hast Fragen dazu und brauchst weitere Informationen? Lass Dir von uns helfen!
- Besuche uns im Byte-Welt-Forum
- Besuche unseren Chat
Wir helfen dir gerne!
Dir hat dieser Artikel gefallen? Oder Du hast Fehler entdeckt und möchtest zur Berichtigung beitragen? Prima! Schreibe einen Kommentar!
Du musst angemeldet sein, um einen Kommentar abzugeben.
-- foobar 02.03.2008 | -- L-ectron-X 30.08.2013 (update)