# Dynamisch Variablennamen generieren?



## ypsdg (22. Jul 2004)

Hallo zusammen,

gibt es eine Möglichkeit innerhalb einer Schleife z.B. neue Stringvariablen zu erzeugen?
also etwa:

for (int i = 0; i==10; i++) {
String name_;  <--- genau das geht aber nicht! 
}

Am Ende sollten dabei also 10 Strings (name0, name1, ...) rauskommen.
Hat jemand eine Idee?
Vielen Dank!

ypsdg_


----------



## bygones (22. Jul 2004)

nöp geht nicht !!
mach doch einen array wenn die anzahl von variablen schon bekannt ist:

```
String[] sa = new String[10];
for(int i = 0; i < sa.length; i++) {
  sa[i] = "irgendwas " + i;
}
```
oder eine Collection wenn größe noch nicht bekannt ist

```
Collection liste = new Vector();
for(int i = 0; i < sa.length; i++) {
  liste.add(i + "");
}
```


----------



## Grizzly (22. Jul 2004)

Wenn man die zwei Beispiele von deathbyaclown zusammenfasst, könnte man auch folgendes schreiben:

```
Vector strings = new Vector();
for (int i = 0; i==10; i++) {
	strings.addElement(String.valueOf(i)); // <-- Beispieldaten
}
String[] stringArray = (String[]) strings.toArray();
```


----------



## bygones (22. Jul 2004)

Grizzly hat gesagt.:
			
		

> Wenn man die zwei Beispiele von deathbyaclown zusammenfasst, könnte man auch folgendes schreiben:
> 
> ```
> Vector strings = new Vector();
> ...


Damit wirst du aber nicht ganz glücklich:

```
Vector strings = new Vector();
for (int i = 0; i==10; i++) {
	strings.addElement(String.valueOf(i)); // <-- Beispieldaten
}
String[] stringArray = (String[]) strings.toArray(new String[strings.size());
```
du musst der Methode noch mitgeben was der Typ des arrays ist.... (sonst wird eine ClassCastException) geworfen

aber ich denke für ypsdg ist das overkill  :wink:


----------



## Reality (22. Jul 2004)

deathbyaclown hat gesagt.:
			
		

> }[/code]
> oder eine Collection wenn größe noch nicht bekannt ist
> 
> ```
> ...



Gibt es ein Unterschied zwischen deinem Code und dem hier?

```
Vector v= new Vector();
```

Liebe Grüße
Reality


----------



## bygones (22. Jul 2004)

nein gibt es nicht... 
genauso geht:

```
List vector = new Vector();
```
ich verwende hier die Interfaces die Vector implementiert. Man sollte wenn ein Interface zu der Struktur vorhanden ist *immer* das Interface nehmen einfach aus Flexibiltätsgrunden...

Das ganze ist eigentlich bei Methoden rückgaben zu verwenden:
man sollte - wenn man eine Collection zurückgeben will nicht schreiben:


```
public Vector getACollection() {
  return new Vector();
}
```
sondern

```
public Collection getACollection() {
  return new Vector();
}
```
hat den Vorteil - wenn du nun merkst - ach Vector passt nicht gut, HashSet, ArrayList oder was auch immer ist besser musst du nur schreiben

```
public Collection getACollection() {
  return new HashSet();
}
```
alle Klassen die diese Methode nützen müssen nicht geändert werden -> das macht deine API flexibel und leicht wartbar


----------



## Reality (22. Jul 2004)

deathbyaclown hat gesagt.:
			
		

> nein gibt es nicht...
> genauso geht:
> 
> ```
> ...


Weil man dann beide Methoden/Klassen zur Verfügung hat?


> Das ganze ist eigentlich bei Methoden rückgaben zu verwenden:
> man sollte - wenn man eine Collection zurückgeben will nicht schreiben:
> 
> 
> ...


Die beiden Ausschnitte sehen mir identisch aus!

Liebe Grüße
Reality


----------



## meez (22. Jul 2004)

Oder nimm ne Hashtable...Dann kannst du sowas ähnliches realisieren...


----------



## Reality (25. Jul 2004)

Warum ist das nun so flexibel?

Liebe Grüße
Reality


----------



## bygones (26. Jul 2004)

Reality hat gesagt.:
			
		

> Warum ist das nun so flexibel?


Wenn du eine Methode aufrufst die eine Collection zugibt musst du dich nicht darum kümmern was für eine Collection es ist. Stell dir vor die Methode wird sehr oft in der Anwendung verwendet. Du hast als Rückgabe Wert Vector angegeben. Nun stellst du fest: "mhm Vector sind dumm hier - ich will keine Duplicate drin haben, hey nehm ich HashSet und schon ist mein Problem gelöst" (als Beispiel). Nun darfst du dich ran machen deine gesamte Anwendung durchzusuchen wo du die Methode verwendet hast und wo du überall Vector geschrieben hast....
Hast du als Rückgabe wert Collection - so musst du das ganze nur in der eigentlichen Methode ändern. Dein Restprogramm bleibt konsistent.....


----------

