Orlok: Private Klassen-Eigenschaften

Beitrag lesen

Hallo 1unitedpower

Eine weitere Alternative, um pro Instanz Daten zu verwalten, wäre übrigens eine Map:

const privates = new Map();
export class Person {
   constructor (age) {
      privates.set(this,{age});
   }, // <--
   get age () {
      return privates.get(this).age;
   }
}

Abgesehen davon, dass das Komma hier einen Syntaxfehler produzieren würde, denke ich nicht, dass eine Map in so einem Fall das Mittel der Wahl sein sollte, jedenfalls dann nicht, wenn Iteration an dieser Stelle nicht benötigt wird.

Das Problem hierbei ist, wie auch bei der Verwendung von Arrays oder von planen Objekten, dass solange die entsprechende Datenstruktur nicht selbst von der Garbage Collection abgeräumt oder das Programm beendet wird, alle von der Klasse erzeugten Instanzen und die dazugehörigen Datenobjekte im Speicher verbleiben, sofern man die Referenzen nicht von Hand wieder entfernt. Das kann abhängig von der Anzahl der von der Klasse erzeugten Instanzen und der Menge der hinterlegten Daten durchaus zum Problem werden.

const privates = new Map( );

export class Person {
   constructor (age) {
      privates.set(this, {age});
   }
   deletePrivateData ( ) {
      privates.delete(this);
   }
   get age ( ) {
      return privates.get(this).age;
   }
}

Um diesem Problem zu begegnen, könnte man natürlich wie in dem Beispiel oben eine extra Methode definieren, die aufzurufen wäre, wenn eine Instanz nicht mehr benötigt wird, allerdings würde ich nicht darauf wetten, dass das auch wirklich jemand machen würde, zumal solche Aufräumarbeiten aufgrund der automatischen Speicherbereinigung in ECMAScript erstens unüblich sind, und zweitens die Notwendigkeit dies zu tun von außen ja gerade nicht ersichtlich ist.

const privates = new WeakMap( );

Wenn Daten mit Objekten zu assoziieren sind ohne sie in den Objekten selbst zu hinterlegen, dann sollte also besser die Verwendung einer WeakMap in Betracht gezogen werden. Wie der Name bereits andeutet, werden hier die Referenzen auf die als Schlüssel verwendeten Objekte schwach gehalten, das heißt, wenn außer dem Eintrag in der WeakMap keine andere, starke Referenz auf ein entsprechendes Objekt mehr besteht, dann wird der Eintrag aus der WeakMap entfernt und das Objekt wird gelöscht, ebenso wie das assoziierte Datenobjekt, auf das nach dem Löschen des Schlüssels auch keine Referenz mehr bestehen sollte.

Viele Grüße,

Orlok