Java: Methode auf erstmaliges Ausführen überprüfen

vom 25.04.2011, 09:43 Uhr

Ich bin gerade dabei eine Methode in einem etwas umfangreicheren Programm zu schreiben. Jetzt hänge ich an einer Stelle, an der ich eine Methode schreiben muss, in der ich überprüfen muss, ob die Methode zuvor schon einmal aufgerufen wurde, da es einen Unterschied machen soll ob die Methode eben das erste Mal oder ein weiteres Mal durchlaufen wird. Jetzt habe ich mir natürlich gedacht, dass ich hier eine ganz normale Variable nehmen kann und dieser natürlich dann beim Verlassen der Methode einen anderen Wert gebe, sodass man diesen beim erneuten Aufrufen überprüfen kann und dann bemerkt, dass die Methode schon durchlaufen wurde. Dies kann ja aber nicht funktionieren, da diese Variable erst dann initialisiert wird, wenn die Methode aufgerufen wird. Das würde doch dann wieder bedeuten, dass die Variable bei jedem Aufruf neu erzeugt wird und dann wieder den ursprünglichen Wert hat.

Aber wie kann ich denn mein Vorhaben nun umsetzen? Ich stehe hier gerade etwas auf dem Schlauch, da das ja nicht so schwer sein kann. Kann es denn sein, dass ich irgendwo etwas falsch interpretiert habe und die beschriebene Methode doch funktioniert? Kann man denn irgendwie eine Variable anlegen, die einfach immer vorhanden ist, sodass sie eben nicht bei jedem Aufruf der Methode neu erzeugt und mit einem festgelegten Wert belegt wird?

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge



Ich kenne mich in Java nicht gut aus, mach aber öfter etwas in PHP. Wenn ich so etwas realisieren will, definiere ich immer eine Variable am Anfang mit 0 und wenn diese Methode dann ausgeführt wurde wird die Variable um 1 erhöht. In deinem Fall kannst du sie ja dann einfach auf 1 setzen. Das gleiche ist in Java bestimmt auch möglich.

Benutzeravatar

» hennessy221 » Beiträge: 5132 » Talkpoints: -1,94 » Auszeichnung für 5000 Beiträge


hennessy221 hat geschrieben:Ich kenne mich in Java nicht gut aus, mach aber öfter etwas in PHP. Wenn ich so etwas realisieren will, definiere ich immer eine Variable am Anfang mit 0 und wenn diese Methode dann ausgeführt wurde wird die Variable um 1 erhöht. In deinem Fall kannst du sie ja dann einfach auf 1 setzen. Das gleiche ist in Java bestimmt auch möglich.


Eine solche Umsetzung habe ich ja schon in Betracht gezogen. Aber wie ich ja auch schon gesagt habe, denke ich, dass dies eben so nicht möglich sein wird. Ich bin der Meinung, dass wenn ich die Methode aufrufe, die Variable neu angelegt wird. Dies geschieht ja dann eben immer, bei jedem Aufruf meiner Methode. Selbst wenn ich die Variable am Ende um eins erhöhe, wird die Variable bei einem erneuten Aufruf der Methode doch erneut auf den ursprünglichen Wert gesetzt, mit dem die Variable eben zu Beginn der Methode definiert wird.

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge



Hallo BrilleWilli,

ich spreche nicht wirklich flüssig Java, allerdings ändert das ja nichts daran, dass sich die verschiedenen Programmiersprachen zumindest in ihren Grundzügen sehr stark ähneln. In diesem Fall musst du eben eine globale Variable anlegen, die vor und nach der Laufzeit einer einzelnen Methode ihre Gültigkeit behält. In Java ist das allerdings nicht so offensichtlich möglich wie in anderen Sprachen. Deine Lösung könnte in etwa wie folgt aussehen:

Code: Alles auswählen
public class globalvars {
  public static int repeat=0;
}

public class yourapplication {
  public static int dostuff() {
    if (globalvars.repeat==0)
      globalvars.repeat=1;
      dostuff=123;
    else
      dostuff=456;
  }
}


Die Methode dostuff() gibt den Integer-Wert 123 zurück, wenn sie zum ersten Mal aufgerufen wurde. Bei jedem weiteren Mal lautet der Rückgabewert stattdessen 456. Sollte sich hier ein Fehler eingeschlichen haben, dann bitte ich den zu verzeihen. Weil ich seit mehr als einem Jahr keinen Java-Code mehr angesehen, geschweige denn geschrieben habe, habe ich mich wohl auch nicht an die Konventionen gehalten.

Benutzeravatar

» Reaper » Beiträge: 576 » Talkpoints: 1,11 » Auszeichnung für 500 Beiträge



Danke Reaper,

ich verstehe wie du das Problem lösen möchtest. Aber ist es dann nicht so, dass ich hier zunächst einmal eine neue Instanz der Klasse "globalvars" erzeugen? Dies würde ich dann ja auch wieder in der Methode meines Programms machen, sodass ich doch wieder genau das gleiche Problem erhalten werde, da ich eben immer wieder die Instanz der Klasse neu erzeugen muss und damit die Variable auch immer wieder auf den Wert null gesetzt wird.

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge


Deswegen habe ich die Integer-Variable "repeat" auch als static deklariert. Weder Variablen noch Methoden mit dem Attribut static sind an ein Objekt gebunden, sondern existieren unabhängig davon nur einmal vom Laden der Klasse bis zum Ende des Programms.

Ich bin leider alles andere als ein Java-Kenner/Könner, daran kann ich mich aber noch ganz gut erinnern. Weil ich von C++ sowie VB.NET globale Variablen gewohnt war, musste ich erst erfahren, dass diese nicht auf derselben Weise in Java funktionieren.

Benutzeravatar

» Reaper » Beiträge: 576 » Talkpoints: 1,11 » Auszeichnung für 500 Beiträge


Ok, dann könnte ich das natürlich auf diese Art und Weise lösen. Aber eine Frage habe ich dann dennoch: Wenn du die repeat-Variable als statisch deklarierst, dann müsste man doch auch einfach eine ganz normale Methoden schreiben können und darin eine ganz normale Zählervariable deklarieren und diese eben dann mit dem Zusatz "static" versehen. Dann müsste diese Variable doch auch einmal erzeugt werden, ich überschreibe ihren Wert wenn die Methode das erste Mal durchlaufen ist, sodass die Variable eben nur einmal einen bestimmten Wert annehmen kann. Dadurch müsste man doch auf die Klasse selbst verzichten können und man erreicht den gleichen Effekt, oder täusche ich mich hier?

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge



Das wäre wohl der nächste logische Gedanke, nicht wahr? Nein, man kann keine als static bezeichnete Variable innerhalb einer Methode deklarieren. Wenn du das versuchst, müsstest du einen Fehler des Java-Compilers erhalten.

Benutzeravatar

» Reaper » Beiträge: 576 » Talkpoints: 1,11 » Auszeichnung für 500 Beiträge


Reaper hat geschrieben:Das wäre wohl der nächste logische Gedanke, nicht wahr?


Dachte ich mir jetzt auch, ja. Aber du hast natürlich Recht und man bekommt einen Fehler, wenn es auf die von mir beschriebene Methoden versuchen würde. Schade eigentlich, dass man es nicht so einfach lösen kann, aber was soll es. Ich werde einfach die von dir beschriebene Möglichkeit verwenden. Danke noch einmal dafür.

Falls noch jemanden eine andere Möglichkeit einfällt, mit der man vielleicht auf die zusätzliche Klasse verzichten kann, würde ich mich aber auch freuen, wenn er sie posten würde.

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge


Du kannst die static Variable auch in deiner aktuellen Klasse verwenden. Dazu nur ein Tipp: Mach die Variable private um das Geheimnisprinzip einzuhalten. Dies müsste dann etwa so aussehen:

Code: Alles auswählen
 
public class yourapplication {
  private static int repeat=0;
  public int dostuff() {
     int dostuff=0;
     if (this.repeat==0)
     {
         this.repeat=1;
         dostuff=123;
     }
     else
     {
         dostuff=456;
     }
     return dostuff;
  }
}

» berndorin » Beiträge: 7 » Talkpoints: 1,77 »


Ähnliche Themen

Weitere interessante Themen

^