Statische Objekte

Oh man, ich traue mich kaum zu fragen, weil die Antwort bestimmt offensichtlich ist. Aber ich merke gerade, dass ich statische Objekte (z.B. in Java) noch nicht wirklich verstanden habe.

Wenn ich, wie in meinem Problem gerade, ein Singleton - das ja static ist - machen möchte, gleichzeitig dort aber Attribute (egal welche, aber eben zu dem Objekt dazugehörig) einbringen will, müssen die dann auch static sein?
Oder ist das statische Objekt des Singletons eigentlich auch ein ganz normales Objekt, nur eben einzigartig für die ganze Klasse?

Und wie würde ich dann mit diesen Attributen arbeiten? Greife ich ggf. darauf über this.attribut zu bzw. kann ich die so zuweisen?
Also in der Klassse

(public) name: String;

setzeName( string ) {
this.name = name;
}

schreiben oder muss ich dazu die statische Instanz ansprechen (also _instance.name = name)

Irgendwie fällt mir nach so langer Zeit auf, dass ich das prinzip von statischen Objekten noch nicht ganz verstanden habe. :frowning:

Ich hoffe, mir kann hier jemand helfen, diesen Denkknoten zu lösen.

Ich danke euch schon mal im Voraus,

Tobias

oder vielleicht anders formuliert:

Wenn ich in meiner Klasse des Singletons mit dem Attribut arbeite, muss ich dann auf die _instance verweisen, oder reicht da das normale Attribut.

Also ist es das selbe, wenn ich schreibe

funktion gibNamenAus(){
schreibe(name);
}

und

funktion gibNamenAus(){
schreibe(_instance.name);
}

Ich habe immer gedacht, dass _instance eben auch eine Instanz der Klasse ist, nur eben statisch. Folglich sollte ich doch auf „name“ einfach zugreifen können, da die Instanz der Klasse doch für sich auch ein eigenes Objekt „name“ angelegt hat, oder sehe ich das falsche???

Hossa :smile:

Statische Objekte haben keinen this-Zeiger!

Daher teilen sich alle Instanzen einer Klasse dasselbe statische Objekt. Innerhalb der Klasse kannst du das statische Objekt über seinen Objektnamen ansprechen. Außerhalb der Klasse (sofern es public ist) über Klassenname.Objektname…

Viele Grüße

Hasenfuß

Hallo Tobias,

ich glaube, der Begriff „statisches Objekt“ ist etwas ungünstig gewählt. Ein Objekt an sich kann nicht statisch sein (zumindest in mir bekannten Programmiersprachen). Lediglich Klassenmember wie Attribute und Methoden können statisch sein. Ich denke, was das bedeutet, hast du schon durchblickt: Das jeweilige Member gibt es dann nicht separat für jede Instanz der Klasse, sondern ein mal für die Klasse.
Ein Singleton ist jetzt eine Art Mischform aus beidem. Erst einmal ist eine Singleton-Klasse eine ganz normale Klasse mit nicht-statischen Methoden und Attributen. Natürlich kann sie auch statische enthalten. Was diese Klasse jetzt zum Singleton macht, ist der private Konstruktor und die statische Klassenvariable mit der Instanz.
Diese Instanz ist eine ganz normale Instanz der Klasse - eben wie jedes andere Objekt, das du erzeugen würdest, auch. Der private Konstruktor in Verbindung mit der getInstance() sorgt nur dafür, dass höchstens eine Instanz angelegt werden kann.
Somit kannst du in deiner Singleton-Klasse auf die nicht-statischen Attribute ganz normal mit Namen zugreifen und musst nicht den Umweg über _instance gehen. _instance würde hier ja sowieso in jedem Fall die Referenz auf das aktuelle Objekt haben. Genauso wie this. Sofern es aber nicht zur Überdeckung von Bezeichnern kommt, ist die Angabe nicht nötig.

Nico