# Objekte einer Klasse zählen



## Crunker (27. Nov 2006)

Hallo zusammen,

ich habe eine Frage bezüglich der Objekte in Java.
Ich wollte fragen ob es irgenwie möglich ist die Anzahl der Objekte einer Klasse zu zählen und eventuell die einzelnen Namen noch auszugeben. Die Ausgabe der Namen ist mir nicht so wichtig, es geht vorallem um die Anzahl :!: 
Konkret ist meine Frage ob es irgendeinen speziellen Befehl gibt, mit der man die Objekte zählen kann, oder ob jemand den Code für eine Methode kennt, welche diese Funktion erfüllt? Vielleicht mit Beispielcode.

Danke schon mal im Vorraus, wenn ihr noch Informationen braucht, nur anschreiben, bin heute den ganzen Tag im Forum!!!

Gruss
Crunker


----------



## Guest (27. Nov 2006)

Einfach ne 
	
	
	
	





```
static
```
Variable und diese im Konstruktor jeweils um 1 erhöhen.


----------



## Leroy42 (27. Nov 2006)

Du kannst soetwas nur bei selbstdefinierten Klassen einführen.


```
class MyClass {
  private static in numInsts;
  public MyClass() {
    numInsts++;
    // ...
  }
}
```

Allerdings bekommst du keine (sichere) Möglichkeit
die vom Garbage Collector freigegebenen Instanzen
abzuziehen.


----------



## Guest (27. Nov 2006)

Ist auch kein Problem, einfach im Destruktor wieder abziehen.[/quote]


----------



## Guest (27. Nov 2006)

Beispiel:

```
public class Zaehler 
{
	public static int zaehl = 0;
		
	Zaehler()
	{
		zaehl+=1;		
	}
	
	protected void finalize()
	{
		zaehl-=1;
	}

}
```


----------



## Wildcard (27. Nov 2006)

Das ist keine sichere Methode. Einzig verlässlich sind hier PhantomReferences


----------



## WieselAc (27. Nov 2006)

Wobei man erwähnen sollte, dass die Sache mit "Destruktor" etwas schwammig ist, da dieser nicht zwangsläufig ausgeführt wird bzw. man keine feste Aussage über den Zeitpunkt des Aufrufes machen kann. Deshalb sollte man den "Destruktor" also nur sehr vorsichtig und wohl überlegt einsetzten. Er ist nicht analog zum c/c++ destruktor zu sehen.


----------



## Leroy42 (27. Nov 2006)

Das genau meinte ich mit _keine (sichere) Möglichkeit_.


----------



## Wildcard (27. Nov 2006)

Leroy42 hat gesagt.:
			
		

> Das genau meinte ich mit _keine (sichere) Möglichkeit_.


Doch. Wie schon erwähnt PhantomReferences.


----------



## Ark (27. Nov 2006)

@Leroy42: Sieht ganz so aus, als fehlte der synchronized-Block um posting.php. 

MfG
Ark


----------



## Crunker (27. Nov 2006)

Ihr hab mir noch gedacht, es währe vielleicht möglich mit einer Testklasse, welche durch eine Methode die Objekte einer anderen beliebigen Klasse zählt und dieser der Testklasse zurückgibt und diese gibt dann die Variable aus.
Währe dies umsetzbar? Wie sollte man das am besten tun?

Danke für eure Antworten


----------



## WieselAc (27. Nov 2006)

Nicht das du jetzt verwirrt bist. Mit der static variablen kannst du schon das machen was du willst. Du kannst damit zählen wieviele Objekte erstellt wurde. Wie beschrieben einfach eine variable private static counter deklarieren und sie im Konstruktr um 1 inkrementieren. Du bekommst nur etwas mehr auswandm, wenn du gelöschte Objekte wieder abziehen möchtest. Du kannst das mit finalize probieren, ist aber nicht zwingend erfolgreich. Alternative solltest du dich mal über die hier schon erwähnten PhantomReferences umsehen. Ist allerdings nicht so "simple" zu implementieren wie ein static counter. Es kommt halt drauf an was du machen willst.

Wenn genau weißt wannein Objekt erzeugt wird und wann du es wieder löschst, kannst du natürlich auch die von dir beschriebe Variante mit einer "Zähl-Methode" verwenden. Wobei ich an deiner Stelle dann wieder zum static counter zurückgehen würde, den ich dann nur über eine Methode um eins explizit verringern würde, wenn ein Objekt zerstört wird.


----------



## AlArenal (27. Nov 2006)

Jetzt kommt erstmal meine Standard-Frage:

Wofür meinst du das zu brauchen?


----------



## Leroy42 (27. Nov 2006)

Vielleicht eine Art Preisausschreiben?

Das millionste erzeugte Objekt bekommt umsonst einen
Programmlaufzeitlangen Schutz vor dem Garbage Collector?  ???:L


----------



## Wildcard (27. Nov 2006)

Leroy42 hat gesagt.:
			
		

> Das millionste erzeugte Objekt bekommt umsonst einen
> Programmlaufzeitlangen Schutz vor dem Garbage Collector?  ???:L


Ich glaube jeder 3te Programmierer gewährt diesen unabsichtlich  :lol:


----------



## LoN_Nemesis (27. Nov 2006)

Seid ihr sicher, dass das mit der static Variablen, die im Konstruktor erhöht wird funktioniert?

Ich wollte sowas auch mal machen vor längerer Zeit. Es gab eine Klasse Node und jeder Node musste wissen wieviel andere Nodes es gibt. Dabei konnten nur Nodes hinzukommen, aber keine verschwinden. In der static Variablen stand aber immer ein zu hoher Wert, ich habe mir das damals so erklärt, dass bei einem Aufruf wie


```
Node[] gitter = new Node[20];
```

auch der Konstruktor aufgerufen wird.


----------



## wranger (27. Nov 2006)

Moin

Natürlich wird der Konstruktor bei diesem Aufruf mit aufgerufen. 

Nach meinen Kentnissen müssten sich in deinem Array referenzen auf 20 Objekte vom Typ Node befinden. Die dann ja auch schon alle schön ansprechen kannst. Gell?

MfG
wranger


----------



## Roar (27. Nov 2006)

genau, und wenn deine klasse node zum beispiel so aussieht:

class Node {
  public Node(int wert) {
      ...
  }
}

dann rät java bestimmt welchen wert er dem konstruktor übergeben soll 
der konstruktor wird bei new Node[20] natürlich nicht aufgerufen und danach ist auch noch kein wert im array initialisiert, aufdeutsch alles null :O


----------



## WieselAc (27. Nov 2006)

Naja nicht so ganz bei dem Aufruf werden die Objekte noch nicht erzeugt. Im Array steht noch überall null drin. Erst wenn du das Array instanziert hast (z.B.: in einer for schleife oder so) werde die Objekte wirklich angelegt und somit der Konstruktor gerufen. Im Beispiel sollte also  der counter immer noch 0 sein.


----------



## Leroy42 (27. Nov 2006)

In Smalltalk hat man da totale Freiheit.

Hab' mal direkt in der Klasse Object eine Map eingebaut, die für
jede Klasse, egal ob eigene oder System-Klasse, eine Liste der
von dieser Klasse erzeugten Objekte gehalten hat.

Ist schon interessant zu verfolgen wieviele 10,000 Objekte pro
Sitzung generiert werden.


----------



## wranger (27. Nov 2006)

Roar hat gesagt.:
			
		

> genau, und wenn deine klasse node zum beispiel so aussieht:
> 
> class Node {
> public Node(int wert) {
> ...



Wohl nicht ... aber den Standardkonstruktor könnt er aufrufen ... 

```
class Node {
  private static int counter;
  public Node() {
      counter++;
  }
}
```
So war zumindest meine Überlegung ...



> Naja nicht so ganz bei dem Aufruf werden die Objekte noch nicht erzeugt. Im Array steht noch überall null drin. Erst wenn du das Array instanziert hast (z.B.: in einer for schleife oder so) werde die Objekte wirklich angelegt und somit der Konstruktor gerufen. Im Beispiel sollte also der counter immer noch 0 sein.



Das wusste ich nicht mehr ... erscheint aber auch logisch 

MfG
Wranger


----------



## Crunker (27. Nov 2006)

Danke für die Antworten, ich werde es mit der Static Variable mal versuchen, ich denke das sollte machbar sein. Ich bin halt erst an den Java Grundlagen, aber ich hab ja noch bis nächsten Sommerzeit mich in die Materie zu vertiefen.
Ich brauche das Objektezählen, für eine Art Statistik, ist eine Aufgabe, welche ich habe. Dazu habe ich gedacht, dass es nützlich währe zu wissen wieviele Objekte eine Klasse hat, denn eine Klasse weiss ja nicht was für Objekte von ihr abstammen!!

Gruss


----------



## Wildcard (27. Nov 2006)

Ich denke eigentlich nicht das es sinnvoll ist, aber trotzdem viel Glück  :wink:


----------



## AlArenal (27. Nov 2006)

Leroy42 hat gesagt.:
			
		

> In Smalltalk hat man da totale Freiheit.
> 
> Hab' mal direkt in der Klasse Object eine Map eingebaut, die für
> jede Klasse, egal ob eigene oder System-Klasse, eine Liste der
> ...



Smalltalk ist eben schon ein ganzes Stück anders. Auch Klassen sind Objekte und wer an eigenen oder vorhandenen Klassen arbeitet, muss sich mit dem Gedanken befassen, dass er nicht irgendwelchen Code bearbeitet, sondern ins laufende System eingreift.

Würde auch mal gerne was in Squeak machen, aber mir fehlt da so der richtige Einstieg. Ich will mich ja nicht mit E-Toys oder diesem Krims befassen...


----------



## Leroy42 (27. Nov 2006)

AlArenal hat gesagt.:
			
		

> Würde auch mal gerne was in Squeak machen, aber mir fehlt da so der richtige Einstieg.



Ach komm! Das versprichst du doch schon seit einem halben Jahr!  

Edit: Hier zur Gewöhnung schon mal die häufigste (und so ziemlich
auch die einzige) Fehlermeldung:



			
				Object hat gesagt.:
			
		

> Does not understand message: _xyz_


----------



## AlArenal (27. Nov 2006)

Leroy42 hat gesagt.:
			
		

> AlArenal hat gesagt.:
> 
> 
> 
> ...



In der Tat. Ich schaue auch immer mal wieder rein, sauge mir aktuelle Versionen und lese hier und da. Was mir einfach fehlt ist ne Möglichkeit ein sauberes UI zu erzeugen. Was ich da so an Wisgets finde sieht eher aus, wie gerade beim Malen mit Fingerfarben entstanden... Literatur zum gemütlich auf der Couch durchlesen finde ich auch nicht.


----------

