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

Drei Möglichkeiten um Java Objekte zu zerstören

Java Objekte zerstören

Java Objekte leben genau solange, wie eine Referenzvariable auf sie zeigt. Wenn dieser Zeiger nicht mehr existiert, wird dieses Objekt aufgeben. Und wenn dieses Objekt erst einmal aufgegeben wurde, dann kommt der Garbage Collector und entsorgt dieses. Aber wie kannst du nun am Sinnvollsten Objekte aufgeben? Lass es uns herausfinden.

3 Möglichkeiten – Java Strings verketten und zusammenfügen

Java Strings verketten

Kennst du dieses Relikt längst vergangener Tage? Ein Brief. Ja früher einmal war es üblich, Briefe zu schreiben. Lange bevor es Smartphones oder Email gab. Man stelle sich einmal vor…. Die Leute mussten sich hinsetzen mit einem Blatt und einem Stift – und richtig schreiben. Nein nicht tippen – schreiben. 🙂 Grausame Welt, oder? Aber […]

So nutzt du getter und setter Methoden bei der Java Programmierung

Java Keyword private

In diesem Artikel möchte ich dir zeigen, wie du Instanzvariablen innerhalb der Java Klasse schützt. Und den Zugriff nur noch indirekt über getter und setter Methoden anbietest. Stell dir vor. Du hast ein Programm zur Lagerverwaltung geschrieben. Dieses Programm dient Möbelhäusern dazu, ihre Bestände zu verwalten. Und das Programm erwartet vom Nutzer gewisse Eingaben zu […]

Java Exklusives Oder – So nutzt du den Xor Operator

Java exklusives oder

In diesem Beitrag möchte ich dir den Xor Operator von Java vorstellen. Dieser Operator wird auch als ausschließendes oder exklusives Oder bezeichnet. Ein Beispiel: Was wilst du heute zum Mittag essen: Fleisch oder Fisch? Auf diese Frage gibt es nur eine Antwort. Es ist entweder Fisch oder Fleisch. Niemals beides. Das Eine schließt das andere […]

So nutzt du die While Schleife in deinem Java Programm

Java While Schleife

Manchmal ist es wichtig, Dinge einmal öfter zu tun. Bei der Java Programmierung kann es schonmal sein, dass du einen Code mehrfach ausführen lassen musst. Zum Beispiel die Zahlen eins bis zehn. Ein Java Programm, welches die Zahlen eins bis zehn wiedergibt. Na wie wäre das? Der Java Code dazu würde so aussehen: public class […]

So kannst du Java Arrays anlegen

Java Arrays anlegen

Java Arrays– Was ist das? Stell es dir einmal als ein Bücherregal vor. In einem Bücherregal befinden sich sämtliche Bücher. Und diese befinden sich schön nebeneinander. Jedes Buch hat seinen festen Platz. Du kannst die Bücher ganz genau lokalisieren. Zum Beispiel kannst du sagen. Das erste Buch von links Das dritte von rechts usw. Und […]

So nutzt du das Java Keyword public

Java Keyword public

Java Programme bestehen aus Java Klassen. Und der Zugriff auf eine Java Klasse sollte nach außen immer gewährleistet sein. Was bedeutet das? Du solltest in jeder Klasse die Möglichkeit haben, ein Objekt einer anderen Klasse anzulegen. Gerade durch diese Möglichkeit macht doch das ganze Klassenkonstrukt erst Sinn.

Java Methoden mit variabler Argumentenanzahl – VarArgs

Java Methoden mit variabler Argumentenanzahl VarArgs

Du kennst das noch. Kopfrechnen und zwar auf Zeit. So etwas ist das Standardprogramm in den Schulklassen 1 bis 5. Irgendwann, in Klasse 6 oder 7, kommt der Taschenrechner ins Spiel und Kopfrechnen ist aus dem Schulalltag gestrichen. Schade eigentlich. Dabei kann man diese Disziplin auch wunderbar in kleinen Spielen unterbringen. Ich erinnere mich noch: […]

Den Java Vererbungsbaum nach dem Ist-Es-Prinzip richtig entwerfen

Java Vererbungsbaum

Vererbungsbaum in Java – klingt erstmal komisch. Dennoch wird dies so bezeichnet. Gemeint sind damit – die einzelnen Hierarchiestufen oder Vererbungsebenen – von der Superklasse bis runter zu den Kindklassen. Wie sieht das nun konkret aus? Vererbung bedeutet: Du definierst einen allgemeinen Typen – zB. Möbel Und dann implementierst du eine Unterklasse, welche die Oberklasse […]

Java lernen durch ständiges Testen – Nutze die Testumgebung von Eclipse

Java Programmierung lernen

Probieren geht über studieren Wenn du wirklich Java Programmierung lernen möchtest, dann solltest du Java nicht aus einem Buch lernen. Du solltest auch nicht strikt von dieser oder anderen Webseiten lernen. Etwas wirklich zu lernen, setzt die Bereitschaft voraus, etwas zu probieren. Denn nur durch eigenes Probieren gelangst du zum Wesentlichen. Durch Probieren wirst du […]