Skip to main content

Das Instanzieren von Java Klassen verhindern

Die Instanzierung von Java Klassen verhindern.

Was heißt das?
Instanzen sind die Objekte einer Java Klasse.
Und Instanzieren oder Instanzierung heißt nichts anderes, als Objekterstellung.

Aber was soll das?
Oder mal anders gefragt:

Wieso sollte man verhindern, dass eine Java Klasse – Objekte erstellen kann?

Schließlich sind doch Objekte der Sinn und Zweck jeder objektorientierten Programmiersprache.
Oder doch nicht?

In diesem Beitrag möchte ich dir zwei Möglichkeiten vorstellen, wie du das Instanzieren von Java Klassen verhindern bzw. verbieten kannst.
Außerdem gehe ich auf das „WARUM“ ein.
Also wann macht es Sinn, Objekte zu erstellen und wann eben nicht.

Lass uns loslegen.

So werden Instanzen einer Java Klasse erstellt.

Wie legst du Objekte aus bestimmten Java Klassen an?
Na klar, per Konstruktoraufruf.

Java Objekte verhindern Konstruktoraufruf

Dieser Konstruktoraufruf ist somit ein direkter Befehl an das Programm, welcher besagt:

„Jetzt erstell mir ein Java Objekt aus genau dieser Klasse!“

Das Programm bekommt also den Befehl.
Dann schaut sich das Java Programm den Konstruktor an und prüft die Signatur.

Java Objekte Instanzieren verhindern Konstruktor aufruf

Nachdem das Programm den Konstruktor und seine Signatur kennt,

  • geht es in die entsprechende Klasse,
  • erstellt das Objekt anhand des signaturspezifischen Konstruktors
  • und führt den Code im Rumpf des Konstruktors aus.

Am Ende steht ein neues Java Objekt mit allen Instanzvariablen und Instanzmethoden der Klasse.
Ist doch toll, oder? 🙂

Aber…..

Wann sollte man das Erstellen von Java Objekten einschränken.

Hier ein Beispiel:
Nehmen wir mal an – Du hast ein Java Programm entwickelt und dieses darf nur von einem User benutzt werden.
Wirklich nur von einem einzigen User.

Also erstelle ich eine Java Klasse, namens „Benutzer“.
Dann könnte die Klasse Benutzer, in etwa so aussehen.

public class Benutzer {
	String benutzerName;//Variable welche den Namen der Benutzer speichert
	
}

Und noch eine Klasse mit main-Methode, um das Programm zu starten.


public class ObjektVerhindernProgramm {

	public static void main(String[] args) {
		
	}
}

Wenn du jetzt zum Programmstart, verschiedene Objekte der Benutzer-Klasse anlegst – geht dies ohne Weiteres.
Kein Meckern, kein Klagen – seitens des Programmes.

Und dies ist natürlich blöd.
Denn ab dem zweiten Benutzer muss das Programm, die Objekterstellung verhindern.
Oder es sollte mindestens ein Hinweis erscheinen.

Also, wie könntest du so etwas im Programm umsetzen?

Mit Privaten Konstruktoren kannst du das Erstellen von Objekten verhindern.

Zuerst braucht die Klasse „Benutzer“ einen echten Konstruktor.
Wenn du vor dem Konstruktor das Keywort private einfügst, ist dessen Sichtbarkeit beschränkt.

Und dann ist es anderen Klassen unmöglich – ohne Weiteres – Objekte aus dieser Java Klasse zu erstellen.
So wie hier:


public class Benutzer {
	String benutzerName;
	
	private Benutzer(){
		
	}	
}

Java Objekte erstellen verhindern private Konstruktoren

Das Instanzieren von Objekten wird somit komplett verhindert.
Wir wollten es aber bedingt zulassen, oder?

Aber durch etwas Programmlogik, kannst du das Erstellen von Java Objekten dennoch ermöglichen.

Ganz klar – Das Anlegen von Java Objekten muss an Bedingungen geknüpft sein.
Und diese Bedingung lautet:

„Wenn schon ein User existiert, dann keinen zweiten.“

Also brauchst du eine Variable, welche die User zählt.
Da diese nichts mit den Objekten zu tun hat, sollte diese eine Klassenvariable sein.
Falls du den Beitrag, zum „Instanzen-einer-Klasse-zählen“, verpasst hast – klicke später hier.

public class Benutzer {
	static int anzahlBenutzer;//Klassenvariable soll die Anzahl zählen und speichern
	String benutzerName;
	
	private Benutzer(){
		
	}
}

So nun steht die Variable.
Aber wie machst du jetzt das Objekt?
Auf dem üblichen Weg, mit Konstruktor, geht es nicht.
Diese Brücke haben wir hinter uns zerschlagen. 🙂

Da du nicht mehr an den Konstruktor herankommst, muss eine Methode das Java Objekt erstellen.

Diese Methode braucht Bedingungen.
Und Bedingungen setzt du mit if und else Verzweigungen um.
Aber hier erst einmal das Grundgerüst der Methode:


public class Benutzer {
	static int anzahlBenutzer;
	String benutzerName;
	
	//privater Konstruktor kann von außen nicht aufgerufen werden
	private Benutzer(){
		
	}

	//Methode zum Erzeugen von Java Objekten
	static Benutzer erzeugeInstanz(){
		Benutzer neuerBenutzer = new Benutzer();//Erzeugt das Objekt
		return neuerBenutzer;//Liefert das Objekt 
	}			
}

Beginnen wir mit der Signatur der Methode.

Java Objekte erstellen Methode

Im Bild habe ich verschiedene Farben für die drei Bestandteile der Signatur verwendet.
Jetzt lass uns den Methodenrumpf anschauen.
Hier nochmal der Java Code:


public class Benutzer {
	static int anzahlBenutzer;
	String benutzerName;
	
	//privater Konstruktor kann von außen nicht aufgerufen werden
	private Benutzer(){
		
	}

	//Methode zum Erzeugen von Java Objekten
	static Benutzer erzeugeInstanz(){
		Benutzer neuerBenutzer = new Benutzer();//Erzeugt das Objekt
		return neuerBenutzer;//Liefert das Objekt 
	}			
}

Im Methodenrumpf wird zuerst ein neues Objekt erstellt.
Als Rückgabewert (Signatur ROT) steht ein „Objekt der Klasse Benutzer“ und deshalb muss die letzte Anweisung – die „return-Anweisung mit Objekt“ sein.

So das Objekt wird angelegt und auch zurückgegeben.
Jetzt fehlt die Programmlogik, welche die Anzahl der bereits angelegten Nutzer prüft.

public class Benutzer {
	static int anzahlBenutzer;
	String benutzerName;
	
	//privater Konstruktor kann von außen nicht aufgerufen werden
	private Benutzer(){
		
	}

	//Methode zum Erzeugen von Java Objekten
	static Benutzer erzeugeInstanz(){
		Benutzer neuerBenutzer = new Benutzer();
		if (anzahlBenutzer >= 1){
			neuerBenutzer = null;//Zerstörung des Objektes
			System.out.println("Zu viele User");
		}
		else {
			System.out.println("Neuer Benutzer angelegt.");
			anzahlBenutzer++;//Hochzählen der Variablen
		}
		return neuerBenutzer;
	}			
}

Durch den if-Block wird geprüft, ob die Anzahl größer oder gleich 1 ist.
Falls dies der Fall sein sollte, wird das Objekt zerstört.
Und eine Bildschirmausgabe gibt dir die Info, dass zu viele User im Programm sind.

Ansonsten….
Wenn die Anzahl der Nutzer – Null oder Eins ist – startet der else Block.
Und eine Ausgabe bestätigt den neuen Nutzer.

Zum Schluss wird das Objekt zurückgeben.
Dieses neue Objekt kann zwei Zustände haben.

Und weiter geht‘s.
Lege doch einmal ein paar Objekte in der Programmstartklasse an.
Aus Überprüfungszwecken kannst du dir auch die Zählvariable zurückgeben lassen.

Doch bedenke:
Statische bzw. Klassenvariablen werden per Punktnotation am Klassennamen aufgerufen.
Klassenmethoden ebenfalls.

public class ObjektVerhindernProgramm {

	public static void main(String[] args) {
		Benutzer benutzer1 = Benutzer.erzeugeInstanz();//Speichern der Methodenrückgabe als neues Objekt
		Benutzer benutzer2 = Benutzer.erzeugeInstanz();//Rückgabe wird in Variable gespeichert
		
		System.out.println(Benutzer.anzahlBenutzer);//Ausgabe der Benutzeranzahl
	}
}

Klicke auf „RUN“.
Cool, oder?

Probiere es ruhig einmal selbst aus, ob du der Instanzvariablen – Werte zuweisen kannst.

public class ObjektVerhindernProgramm {

	public static void main(String[] args) {
		Benutzer benutzer1 = Benutzer.erzeugeInstanz();
		Benutzer benutzer2 = Benutzer.erzeugeInstanz();
		
		System.out.println(Benutzer.anzahlBenutzer);
		
		benutzer1.benutzerName="Matze";//erster Benutzer namens Matze
		System.out.println(benutzer1.benutzerName);//Überprüfung
	}
}

Klicke nochmal auf „RUN“.
Und läuft?

Mach es einmal beim zweiten Benutzer-Objekt.

Java Objekte Erstellen Verhindern Exception

Es kommt natürlich zu einer Null-Pointer-Exception, da ab dem zweiten Benutzer – die Variable ins Nullfeld bzw. ins Nichts verweist.

Mit Try und catch Blöcken, könntest du diese Ausnahmen behandeln.
Ich steige auf dieses Thema jetzt ab nicht weiter ein.

Stattdessen möchte ich eine Etage tiefer gehen.

Bei der Vererbung gibt es Probleme mit privaten Konstruktoren.

Denn die erweiterten Klassen müssen dann auf den Konstruktor der Superklasse zugreifen.

Hier am Beispiel der Kindklasse „BenutzerWeiblich“.

public class BenutzerWeiblich extends Benutzer{

	BenutzerWeiblich (){
		super();//vergeblicher Aufruf des Superkonstruktors der Elternklasse
	}
}

Die Klasse „BenutzerWeiblich“ erweitert die Klasse „Benutzer“.
Um ein Objekt der Klasse „BenutzerWeiblich“ anzulegen, muss der Konstruktor per „Super-Keywort“ auf den Konstruktor der Vaterklasse zugreifen.
Da der Konstruktor der Vaterklasse, aber private ist – geht dies nicht.

Java Objekte anlegen verhindern private Konstruktoren

Somit solltest du private Konstruktoren nur verwenden, wenn du sicher bist – dass du die Klasse niemals erweitern wirst.
Die Klasse darf somit keine Kindklassen haben, welche von ihnen erben.

Es gilt somit:

  • Verwende private Konstruktoren um die Instanzierung von Java Klassen – komplett, teilweise oder bedingt zu verbieten.
  • Verwende private Konstruktoren aber nicht, falls zur Java Klasse, weitere Kindklassen existieren – von denen Objekte erstellt werden müssen.

Aber…
Es gibt noch eine weitere Möglichkeit das Erstellen von Java Objekten zu verhindern.
Und diese Variante eignet sich eindeutig besser im Zusammenhang mit Vererbung.

Innerhalb einer Vererbungslinie kannst du das Erstellen von Java Objekten auf bestimmten Stufen verbieten.

Schau mal dieses Bild an.

Java Objekte erstellen verhindern Vererbung

Diese Vererbungslinie stammt aus einem früheren Beitrag.

Hier nochmal ganz kurz, worum es geht.

  • Die Superklasse „Lebewesen“ besitzt alle Eigenschaften und Methoden, welche für Lebewesen zutreffen.
    Also all das, was Menschen, Tiere oder Pflanzen gemeinsam haben.
  • Die Kinderklassen erweitern die Superklasse um eigene spezifische Methoden.

Jetzt mal ganz ehrlich….
Ist es nötig Lebewesen-Objekte zu erstellen?

Java Objekte verhindern Polymorphie

Hast du schon einmal von Frauen gehört, welche im Kreissaal so eine Antwort bekamen?
Also ich nicht.

Und genauso ist es in der Javawelt.
Es macht oft keinen Sinn – Lebewesen zu erstellen.
Du erstellst stattdessen, Menschen oder besser noch Mädchen und Jungen.

Somit müsste die Instanzierung für die Lebewesenklasse verboten werden.

Das Instanzieren kannst du mit dem Java Keywort abstract verbieten.

Indem du eine Klasse abstract machst, gilt diese als abstrakt oder allgemein.
Und zwar ist diese so allgemein, dass eine Objekterstellung unnötig ist.

Hier am Beispiel der Lebewesenklasse:

abstract public class Lebewesen {
	int groesse;
}

Und jetzt ist es dir nicht möglich Objekte dieser Klasse anzulegen.

public class ObjektVerhindernProgramm {

	public static void main(String[] args) {
		Lebewesen ueberraschung = new Lebewesen();//Klasse abstract - Es kann kein Objekt angelegt werden
	}
}

Java Instanzen anlegen verhindern

Aber die Klasse Mensch könnte von der Klasse Lebewesen erben.
Und sie ist nicht abstract.

public class Mensch extends Lebewesen {

}

Und jetzt kannst du Mensch-Objekte anlegen und Lebewesen, nach wie vor, nicht.

Java Instanzen Vererbung anlegen

Du kannst das Instanzieren von Java Klassen auf bestimmten Ebenen verbieten.

Angenommen eine Klasse Frau erbt von Mensch.
Und Frau wäre wieder abstract.

  • Dann kannst du keine Lebewesen erzeugen.
  • Du kannst dann Menschen erzeugen, welche hierarchisch unter Lebewesen liegen.
  • Und du kannst wiederum keine Frauen Objekte anlegen, welche von Menschen erben.

Somit bist du mit abstrakten Klassen extrem flexibel, was dein Klassen- und Vererbungsdesign angeht.
Nicht schlecht, oder?

Zusammenfassung:

  • Das Instanzieren von Java Klassen kannst du auf zwei verschiedenen Wegen verhindern.
  • Zum Einen kannst du das Anlegen von Java Objekten verhindern, indem du private Konstruktoren anbietest.
    Dabei solltest du darauf achten, dass keine Kindklassen zur „privaten-Konstruktoren-Klasse“ existieren.
    Mit etwas Code kannst du nur bestimmte Objekte zulassen und somit die Instanzierung steuern und kontrollieren.
  • Mit dem Java Keywort abstract kannst du Java Klassen als abstrakt bzw. allgemein kennzeichnen.
    Von diesen Klassen können dann ebenfalls keine Objekte erstellt werden.
    Aber im Unterschied zu privaten-Konstruktoren-Methode vererbt sich die „Nicht-Instanzierung“ nicht.

Ähnliche Beiträge

So kannst du Instanzen in Java Klassen zählen

Wie kannst du die Instanzen der Java Klassen zählen? Ganz einfach. Am besten ist es, wir bleiben beim Einführungsbeispiel zu den Java Klassen. Und ich wähle die Klasse „Monster“. Um es einfach zu halten, soll auch der Programmstart durch die Klasse erfolgen. Die Klasse bietet somit eine main-Methode an.

So verwendest du den Java Oder Operator

Java Oder Operator

Kennst du das auch aus deiner Schulzeit? Du schreibst eine Klassenarbeit in irgendeinem Fach. Nehmen wir einfach mal an – Mathe. Jetzt bist gerade fertig mit deiner Arbeit. Und zu Hause wirst du gefragt: „Und wie lief es?“ Du antwortet:“ Ganz gut. Es wird bestimmt eine Eins oder eine Zwei.“ Drei oder vier Tage später […]

10 ganz nützlichen Feature der Klasse Java Math

In diesem Beitrag geht es um eine spezielle Java Klasse. Die Klasse nennt sich Java Math. Diese ist in der Standardbibliothek von Java enthalten. Warum solltest du diese Klasse kennen? Die Math Klasse bietet dir einen Menge Methoden an, welche zur Berechnung von mathematischen Gleichungen ganz hilfreich sind. Aber auch für Nichtmathematiker ist etwas dabei. […]

So kannst du dein Java Programm mit der main Methode ausführen

Auf zum ersten Java Programm. Vielleicht fragst du dich jetzt gerade: Na, was haben wir denn bisher gemacht? War das etwa kein Java Programm? Wir haben bisher nur eine Klasse „Human“ für ein zuküntfiges Mensch-Objekt erstellt. Diesem Objekt haben wir eine Instanzvariable, namens size (Größe) zugeordnet. Und wir haben eine Instanzmethode, namens grow (wachsen) geschrieben. […]

Java For Each Schleife – Aufbau und Funktionsweise

Java for each Schleife

In einer anderen Lektion habe ich dir bereits gezeigt, wie du ein Java Array mit einer for-Schleife füllen und dir später die Werte zurückgeben lassen kannst. Es gibt allerdings einen weiteren Schleifentyp, welche geradezu prädestiniert ist für Java Arrays. Dieser Schleifentyp nennt sich for each Schleife. In diesem Beitrag möchte ich dir zeigen, wie du […]

So verwendest du die Java Codeblöcke zur Automatisierung

Java Codeblöcke

In diesem Beitrag geht es um den Einsatz von Java Codeblöcken oder Initialisierungsblöcken. Viele Wege führen nach Rom. Oder Alle Wege führen nach Rom. Heißt es in einem alten Sprichwort. Und so ähnlich ist es bei der Java Programmierung. In diesem Beitrag möchte ich dir einen weiteren Weg vorstellen, wie du Variablen eines Java Objektes […]

So unterstützen dich Java Vererbungstabellen beim Entwurf

Java Vererbungstabellen

Bei der Java Vererbung gibt es zwei Klassenarten bzw. -stufen. Die Superklassen, welche einen allgemeinen Typen darstellen Und die spezielleren Unterklassen, welche die Superklasse um bestimmte Funktionen erweitern. Jetzt ist dieses ganze „Der-erbt-von-dem-Konzept“ mitunter sehr schwierig darzustellen. Zum Beispiel in einem Werkzeugkoffer. In einem Werkzeugkoffer befinden sich sämtliche Werkzeuge, von Säge bis Bohrmaschine. Wie machst […]

Der Aufbau von Java Klassen

Java Klassen Aufbau

Jedes Java Programm besteht aus Java Klassen. Doch wie sind diese aufgebaut? Wie setzt sich die Struktur zusammen? Wo befinden sich Klassen hierarchisch? Was kommt in die Klassen rein und wie wird es integriert? Das sind die Fragen, welche ich in diesem Artikel beantworten werde. Doch bevor wir bei den Klassen ansetzen, müssen wir eine […]

Der Java Datentyp boolean im Interview

Java boolean

Nein, ich bin nicht verrückt. Aber… Neulich traf ich zufällig den Java Datentyp boolean. 🙂 Er erklärte sich bereit, mir ein Interview zu geben. In diesem Interview geht es um die Werte, welcher dieser Wertetyp annehmen kann. Und in diesem Zusammenhang geht es auch um Logik. Also lassen wir uns doch die Logik vom direkten […]

So verwendest du Inkrement und Dekrement Operatoren in deinen Java Programmen

Java Operatoren

In diesem Beitrag geht es um Java Operatoren. Ich möchte dir gern zwei neue Operatoren vorstellen. Diese nennen sich Inkrement und Dekrement. Ja was heißt das? Inkrementieren bedeutet eine schrittweise Erhöhung einer Zahl. Und dementsprechend bedeutet Dekrementieren: Die schrittweise Verminderung einer Zahl. Wozu brauchst du das? Stell dir vor. Du bekommst eine Liste mit Namen […]