Static Variable

  • Antworten:7
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 282

01.04.2012 01:10:46 via Website

Hallo,

ich habe in einer Klasse einen Statischen Counter:

public static int counter;

Den Erhöhe ich jedesmal um wenn ein Objekt erstellt wird um 1.
Möchte ich allerdings außerhalb der Klasse den Counter abfragen, bekomme ich immer 0 zurück geliefert. Logge ich aber auf was der Counter erhöht wurde, sehe ich das dieser ganz normal durchzählt.

Wieso?

LG,
Daniel
  • Forum-Beiträge: 282

01.04.2012 12:42:52 via Website

Ich frage die Variable über MeineKlasse.getCounter() ab. Ich erzeuge also vorher kein Objekt davon, könnte es daran liegen?
getCounter() ist eine statische Methode von MeineKlasse welche nur den counter zurück gibt.
  • Forum-Beiträge: 203

01.04.2012 12:49:18 via Website

Daniel online
Ich erzeuge also vorher kein Objekt davon, könnte es daran liegen?
Die Variable ist statisch, also brauchst du kein Objekt erzeugen. Der Fehler muss wo anders liegen.
  • Forum-Beiträge: 282

01.04.2012 13:20:38 via Website

ok dann hier mal der Code:

Meine Klasse:
1public class Eieruhr {
2
3 private static String TAG = "Eieruhr";
4 private static boolean DEBUG = true;
5
6 public static int count = 0
7
8
9 public Eieruhr(Context ctx, int pos){
10 this.ctx = ctx;
11 count++;
12 position = pos;
13
14 if(DEBUG) Log.d(TAG,"Eieruhr erstellt. position="+position+". Count="+count);
15 }
16
17 public static int getCount(){
18 return count;
19 }

Die Abfrage aus einer anderen Klasse wie hier ergibt dann immer 0:
1if(DEBUG)Log.d(TAG,"COUNT= "+Eieruhr.count);


Ich habe jetzt nur den relevanten code kopiert.... ich verstehe einfach nicht wieso das nicht funktioniert. Ist ja eigentlich ziemlich simple...
  • Forum-Beiträge: 1.727

01.04.2012 13:32:12 via Website

Ist zwar noch wenig kontext, aber versuch mal ein synchronized so das alle Threads die Änderungen "sehen"...

public static synchronized int getCount(){
return count;
}

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

  • Forum-Beiträge: 2.158

01.04.2012 16:53:07 via Website

Was ist denn die andere Klasse?
Läuft die innerhalb desselben App Kontextes, oder ist es ein Service oder evtl. was ganz eigenständiges?

static Variablen gehören dem Classloader.
D.h. wenn du innerhalb eines Geräts zwei App Instanzen hast, die von unterschiedlichen Classloadern geladen wurden, haben die zwei unterschiedliche Exemplare der Variable.
Auch wenn die App aus dem Speicher geräumt wird (also auch die Klassen unloaded werden), wird der Wert zurückgesetzt.
  • Forum-Beiträge: 338

01.04.2012 17:02:26 via Website

Ich schätze du hast einen Fehler im von dir entfernten "irrelevanten" Code :-)

Rein aus dem Gefühl heraus würd ich sagen, du zählst die falsche count variable hoch. Schon rein aus Gründen der Codelesbarkeit, schreib doch einfach mal "Eieruhr.count++" statt nur "count++";