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

Eine Java Konsoleneingabe machst du über den Scanner

Es wird Zeit für die erste Java Konsoleneingabe. Und diese Eingaben machst du über den Java Scanner. Was ist das? Der Scanner ist eine vorgefertigte Java Klasse, welche Java mit seiner API anbietet. Das heißt du musst nichts selbst erschaffen. Du musst nur wissen, wie du darauf zugreifst. Erst einmal musst du einen Scanner anlegen. […]

Der wichtige Unterschied zwischen Java Methoden

Java Methoden Unterschied

Jetzt machen wir Nägel mit Köpfen. Dieses Sprichwort stammt aus den Anfängen des Industriezeitalters. Denn früher wurden Nägel nicht industriell, sondern per Hand gefertigt. Und da kam es schon einmal vor, dass versehentlich Nägel ohne Kopf produziert wurden. Was blieb ist das Sprichwort „Nägel mit Köpfen“ Und dieses steht sinngemäß für eine schnelle, qualitativ hochwertige […]

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.

So richtest du einen Schreibschutz für deine Java Variablen ein

Stell dir vor: Du hast erfolgreich dein erstes Programm für die Personalabteilung aufgesetzt. Du hast deine ersten 1000 Datensätze schön sauber angelegt. Und nun kommt dein Kollege und überschreibt die Vornamen der ersten 100 Mitarbeitern. Na schöne Sch…. 🙂 Wie kann das passieren? Wie kann man das verhindern? Du brauchst eigentlich nur deine Java Variablen […]

So kannst du in drei einfachen Schritten Java Arrays dynamisch vergrößern

Java Arrays vergrößern

Es ist der 31.März 1727. Es ist ein Montag. Die Welt nimmt Abschied von einem sehr bedeutenden Weltveränderer. Seine Sichtweisen beeinflussen, heute noch, die Forschung und Entwicklung im Bereichen der Physik und Chemie. Ja selbst unser aller Leben – unsere Sicht auf die alltäglichen Dinge – wurden durch seine Denkstöße revolutioniert. Dieser große Vorreiter starb […]

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 […]

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 […]

Java Übung 18: Berechne die Fakultät

Java Übung Fakultät

In dieser Java Übung geht es um die Fakultät aufeinander folgender Zahlen. Für alle, bei denen der Mathe-Unterricht genauso lange her ist, wie bei mir: 🙂 Die Fakultät ist das Produkt aufeinander folgender natürlicher Zahlen. Zum Beispiel: Die Fakultät von 2 ist: 1*2=2 Die Fakultät von 5 ist: 1*2*3*4*5=120 So – ich hoffe, dass ich […]