Der folgende Text setzt Grundkenntnisse der objektorientierten Programmierung sowie die Kenntnis grundlegener Begriffe wie Objekt, Variable, Referenz, Stack und Heap voraus. Er definiert Begriffe und Kategorien und stellt keinen ausführlichen Lehrbuchtext dar.
Die berechtigte Frage wozu die Unterscheidung der Arten nützlich ist soll jedoch nicht übergangen werden. Allgemein kann man sagen "Kategorienbildung dient der Ökonomie des Denkens". Konkret ist die Motivation folgende: In der alltäglichen Programmierung stecken immer wieder grundlegende Muster. Im Umgang mit Objekten sind diese Muster durch die Verwendungsarten von Objekten und Objekt-Referenzen bestimmt. Die Handhabungsarten hingegen werden durch die verwendete Programmiersprache vorgegeben. Das Bewusstsein der gewünschten Verwendungsarten ermöglicht eine klare Entscheidung für passende Muster, die dann ggf. auch durch einen Codegenerator erzeugt werden können.
Diese Handhabung finden wir in C++. Eine Variable bezeichnet den Speicherbereich eines Objektes. Die Zuweisung zu einer solchen Variablen weist dem Objekt einen neuen Zustand zu. Diese Handhabung führt bei Klassen die Ableitungen mit abweichendem Speicherbedarf haben zum Problem des Slicing. Um sich auf ein Objekt zu beziehen muss eine Referenz gebildet werden.
Objekte können im Stack liegen, in andere Objekte eingebettet werden oder im Heap liegen.
Diese Handhabung finden wir in Java, C# und vielen anderen objektorientierten Programmiersprachen. Eine Variable bezeichnet den Speicherbereich einer Objektreferenz.
Objekte liegen im Heap. Sie können nicht im Stack liegen und nicht in andere Objekte eingebettet werden.
Sprachen wie C# bieten ergänzend die Struktur "struct" an, um frei definierbare Werttypen zur Verfügung zu stellen. Dies verbessert die Entwicklungseffizienz und bei Typen kleineren Speicherbedarfs i.d.R. die Laufzeitperformance. Es kann den Speicherverbrauch verringern und entlastet einen Garbage-Collector i.d.R. Insbesondere wenn der, wie in Java, mit einem Tracing-Verfahren arbeitet.
Es gibt drei wesentliche Arten, ein Objekt zu verwenden. Als Modellobjekt, d.h. als Teil eines Objektmodells, als Variablenobjekt oder als Wertobjekt. Das Modellobjekt entspricht der eigentlichen Idee eines Objektes. Variablenobjekte werden wie Variablen verwendet. Wertobjekte repräsentieren einen Wert. Ihre Identität ist jedoch nicht von Interesse, was für ein Objekt atypisch ist.
In der Sprache Java sind Variablen- und Wertobjekte u.a. der Tatsache geschuldet, dass Java keine Konstrukte für programmdefinierte Wertetypen besitzen. In C# gibt es dafür die Struktur "struct". In C++ sind auch Klassen Werttypen. Sie müssen ansonsten explizit referenziert werden. Referenzen von größeren Wertobjekten können eine bessere Laufzeitperformance haben als Wertetypen.
Folgende Tabelle zeigt ein paar wesentliche Eigenschaften der Verwendungsarten:
Identität semantisch relevant: Das ist genau dann der Fall wenn es nicht zulässig ist zu einem beliebigen Zeitpunkt statt eines Objektes ein anderes zustandsgleiches Objekt zu verwenden. Dies darf nicht mit der Austauschbarkeit eines nur einmal referenzierten Objektes verwechselt werden.
Identität technisch relevant: Das ist genau dann der Fall wenn es technisch nicht zulässig ist zu einem beliebigen Zeitpunkt statt eines Objektes ein anderes zustandsgleiches Objekt zu verwenden. So ist bei Unikat-Wertobjekten die Identität semantisch nicht relevant, technisch jedoch dann, wenn sie zum Vergleichen verwendet wird. Unikatobjekte werden englisch auch als "interned" bezeichnet
Veränderung erlaubt: Das eine Veränderung nicht erlaubt ist bedeutet nicht, dass sie nicht möglich ist. Zwar sollten Wertobjekte unveränderlich (immutable) sein. Jedoch können auch veränderliche Objekte als Wertobjekte verwendet werden, solange sie nicht verändert werden.
Fremdreferenzierung erlaubt: Andere Variablen dürfen das Objekt referenzieren.
So wie nicht jedes Objekt ein Modellobjekt verkörpert, so verkörpert natürlich auch nicht jede Objekt-Referenz eine Modellobjekt-Referenz. Dabei können Referenzen auf Objekte verschiedener Objekt-Verwendungsarten sogar dem gleichen Zweck dienen.
Eine Referenz auf ein Variablenobjekt kann wie eine Variablenreferenz verwendet werden.
Identitätsobjekt und Identitätenklasse
Variablenobjekt und Variablenklasse, konformes bzw. sprachkonformes Variablenobjekt
Entität (siehe Identitätsobjekt und Identitätenklasse )
Einmaliges Objekt, Unikat und Unikatenklasse
Dieser Text unterliegt dem Urheberrecht. Die Weiterverbreitung, sowie die Übernahme von Passagen die über Zitate hinausgehen ist untersagt. Der Autor gestattet es ihnen, Kopien für den persönlichen privaten und persönlichen kommerziellen Gebrauch zu speichern und zu drucken.
Dieser Text kann jederzeit geändert werden, wird nicht notwendig dauerhaft gespeichert und ist somit nicht zitatfähig.