# Variablendeklaration in einer iterativen Methode = Böse?



## Doug.Heffernan (27. Mai 2005)

Hallo,

ich wollte mal fragen ob es ein No-No ist in einer iterativen Methode Variablen zu deklarieren!

Ich habe die folgende Methode:


```
public static void iterateChildren(Node n) {
  	//machIrgendwasMitNode(n);
  	NodeList list = n.getChildNodes();
  	for(int i = 0; i < list.getLength(); i++) {
  	    Node child = list.item(i);
  	    iterateChildren(child);
  	  }
 }
```

An der Stelle machIrgendwasMitNode will ich eine boolesche Variable anlegen - und während ich das hier so schreibe merke ich wie dämlich das wäre... Die würde ja jedes mal neu initialisiert werden...

Okay, also, wie bekommte ich in diese Methode noch Variablen rein, ich möchte nämlich keine globalen nehmen.
Mir ist klar, dass ich die in den Methodenkopf als Eingabeparameter packen kann, aber es wird nicht bei dieser einen Variable bleiben und daher wollte ich mal fragen ob man das auch irgendwie anders lösen kann.

Ich brauche da nämlich noch so ca. 20 andere Variablen, teils boolesche, teils String, doppelt verkettete Listen, Knoten und so weiter...

MFG Dennis


----------



## Beni (27. Mai 2005)

Du kannst den Variablen gleich beim erzeugen einen Wert zuweisen.

```
boolean nodeHatWas = node.hastDuWas();
```

Ansonsten: es ist durchaus üblich, dass man in der Methode neue Variablen herstellt, und soooo viel Zeit verlierst du dadurch nicht. Sorg einfach dafür, dass du die Variablen nicht zu früh herstellst (also kein riesiger Block am Anfang mit allen Variablen, und danach brauchst du blos 2 von 20 in der Methode).


----------



## Doug.Heffernan (27. Mai 2005)

Hi, aber wenn ich das so mache, dann wird ja bei jedem Aufruf die Variable neu initialisiert. Und das geht ja nicht.

MFG Dennis


----------



## L-ectron-X (27. Mai 2005)

Ich denke, das ist nicht so schlimm, weil die Variablen, die innerhalb einer Methode erzeugt werden, auf dem Stack abgelegt werden. Nach Methodenrückkehr werden diese Variablen, im Gegensatz zu den Objekten auf dem Heap, sofort zerstört.


----------



## Doug.Heffernan (27. Mai 2005)

Ja das ist richtig, aber der zuvor gespeicherte Wert geht weg oder nicht? Wenn ich den Baum durchlaufe und irgendwas finde dann setze ich zb a auf true, wenn das beim nächsten knoten nicht gefunden wird ist a wieder false. Ich möchte also a = a || (false oder true) haben, so das wenn es einmal auf true ist, es auch bleibt. Bei den anderen Variablen möchte ich z.B. immer wenn ich was finde, es zu einer Liste hinzufügen und so weiter... Jemand ne Idee?

MFG Dennis


----------



## Bleiglanz (27. Mai 2005)

dein problem ist wohl folgendes (stimmt das?):

du willst die variablen NACH dem Methodenaufruf irgendwie "haben"?

du willst sie nicht als Argumente der Methode übergeben?

du willst sie nicht als Membervariable der Klasse anlegen?

keine globalen oder static Felder verwenden?

=> dann geht das nicht!!

mach dir 20 Membervariablen, die du bei deinen Methodenaufrufen manipulierst und hol dir wenn alles fertig ist die Werte ab


----------



## Doug.Heffernan (2. Jun 2005)

Ja, das ist genau das, was ich meinte. Das mit den Membervariablen klingt gut, allerdings weiß ich nicht was das ist. Hättest Du mal nen Beispiel dafür?

MFG Dansen

Edit: Ich hoffe Membervariablen sind nicht global ?


----------



## helium (2. Jun 2005)

Ne Membervariable ist ne einfache Instanzvariable


```
class Foo {
   int membervariable;
}
```


----------



## Doug.Heffernan (2. Jun 2005)

Okay Danke, das klingt gut. Da ich auch auf sauberen Programmierstil achten muss, frage ich einfach mal: Wird sowas gern gesehen? Oder eher nicht?

MFG Dansen


----------



## Wildcard (2. Jun 2005)

it depends...
Eine Klasse sollte so wenig Membervariablen wie möglich haben aber sie sind natürlich unumgänglich.
20 Membervariablen sind (wenn das keine GUI Klasse ist) allerdings recht viel, aber was soll man jetzt dazu sagen ohne zu wissen was du eigentlich machen willst und ohne dein KlassenDesign zu kennen.
Wenn du allerdings Membervariablen verwendest, achte darauf das sie private sind.


----------



## Doug.Heffernan (2. Jun 2005)

Okay alles klar!

Vielen Dank für die nette Hilfe!

MFG Dennis


----------

