Skip to main content

So legst du Utility Klassen in Java an

Utility Java Klassen – was ist das?
Man nennt diese auch Hilfsklassen von Java.

Diese Utility Klassen sind Java Klassen, welche lediglich Methoden und Konstanten anbieten.

Am Beispiel:
Die Klasse Math ist so eine klassische Utility Klasse.

Wozu braucht man solche Klassen?
Diese Klassen sind so etwas wie ein Werkzeugkoffer für jedes Java Programm.
Hier sind die Methoden enthalten, welche du für Nebenrechnungen oder auch für den Programmablauf benötigst.

Was ist alles nötig für die Umsetzung einer Hilfsklasse?
Drei Dinge benötigt jede Utility-Klasse.

  1. Die Klasse muss vom kompletten Programm genutzt werden können.
  2. Außerdem müssen die Methoden und Konstanten für alle Objekte und alle Programmteile gelten.
  3. Es muss verhindert werden, dass andere Klassen Objekte aus dieser Klasse erzeugen können.

In diesem Beitrag möchte ich dir zeigen, wie du so eine Hilfsklasse anlegst.
Was bietet sich dafür besser an, als ein Tafelwerk.

Ja ein klassisches Tafelwerk ist der Methodenkoffer für ein Mathematikprogramm.
Natürlich kannst du diese Utility-Klassen auch in einem anderen Programm nutzen.

Hier ein paar weitere Beispiele:

  • In einem Spiel wird die Zeit des Spielers gemessen und gespeichert.
    So eine Methode kann in einer Hilfsklasse liegen und für jedes Nutzer-Objekt zugänglich gemacht werden.
  • Die Steuerung der Frame-Rate in einem Spiel wird über eine Methode vollzogen.
    Auch diese Methode kann in einer Utility Klasse liegen.
  • Auswertungen von Kursverlusten, Renditen in einem Aktienanalyse-Programm.
    Auch hier hilft ein separater Werkzeugkoffer weiter.

Du siehst, die Erstellung einer Java Utility Klasse macht schon Sinn.

So kann die Utility Klasse im kompletten Programm genutzt werden.

Wichtig ist, dass die Klasse nach außen sichtbar ist.
Deshalb muss diese mit dem Access-Modifiers public ausgezeichnet werden.

public class UtilityKlasse {

}

Public bewirkt, dass die Klasse vom kompletten Projekt genutzt werden kann.

So können alle Objekte die Features der Utility Klasse nutzen.

Du brauchst als erstes Konstanten.

  • Auch Konstanten sind immer public.
  • Außerdem sind Konstanten immer final – somit können die Werte nicht mehr geändert werden.
  • Und Konstanten sind objektunabhängig und somit static.
public class UtilityKlasse {
	public final static double PI = 3.14159265359;// Kreiszahl

}

Die Methoden müssen ebenfalls statisch sein.
Hier eine Methode, welche den Flächeninhalt eines Kreises berechnet.

public class UtilityKlasse {
	public final static double PI = 3.14159265359;// Kreiszahl


	static double berechneKreisFlaeche(double radius){
		double flaeche= PI*(radius*radius);
		return flaeche;
	}
}

Zur Erinnerung:
Die Fläche eines Kreis kann mit dem Radius berechnet werden: PI * r².

Was macht die Methode sonst noch?
Die Methode returnt die Fläche vom Datentyp double.
Deshalb wurde hier auch im Kopf der Typ double als Rückgabetyp angegeben.
static double berechneKreisFlaeche()
Das wird noch wichtig, wenn wir die Methode später aufrufen.

Wenn du dir diese Methode so anschaust, erkennst du:
Diese Methode erwartet lediglich Zahlen. Und verrechnet diese.

Aber was ist mit Objekten?
Angenommen du möchtest der Methode einen richtigen Kreis übergeben.

Wie machst du das?
Ganz einfach.
Dann kannst du die Methode überladen und eine zweite Variante dieser Methode anbieten.

public class UtilityKlasse {
	public final static double PI = 3.14159265359;// Kreiszahl

	//Methode erwartet einen Radius als Zahl
	static double berechneKreisFlaeche(double radius){
		double flaeche= PI*(radius*radius);
		return flaeche;
	}
	
	//Methode erwartet ein Kreisobjekt mit einer Instanzvariablen radius
	static double berechneKreisFlaeche(Kreis kreisEins){
		double flaeche= PI*(kreisEins.radius*kreisEins.radius);
		return flaeche;
	}
}

Jetzt wirst du feststellen, dass Eclipse dir einen Fehler anzeigt.

Java Utility Klasse Kreisfläche berechnen

Das ist auch logisch, denn die Methode erwartet ein Kreisobjekt.
Und bisher haben wir noch keine Kreisklasse. 🙂

Bevor du die Methoden der Utility Klasse nutzen kannst, brauchen wir noch einen Kreis.

Also Kreisklasse mit einer Instanzvariablen, namens radius, anlegen.

public class Kreis {
	double radius;

	//Konstruktor für Kreisobjekt
	Kreis(double radius){
	this.radius=radius; //Zuweisung der lokalen Variablen zur Instanzvariablen	
	}
}

Ich biete in dieser Klasse einen Konstruktor an, welche den Radius erwarten.
Somit kann der Nutzer des Programmes beim Erstellen eines Kreisobjektes den Radius gleich übergeben.

Da es sich in der Parameterliste des Konstruktors, um eine lokale Variable handelt – musst du im Rumpf des Konstruktors die Zuweisung mit dem Keywort this erledigen.

Den Kreis beim Programmstart anlegen und Methoden der Utility-Klasse aufrufen

Also brauchst du noch eine Klasse für den Programmstart.
Diese Klasse kannst du nennen, wie du willst.
Hauptsache die main-Methode für den Programmstart ist enthalten.

public class UtilityStart {

	/*
	 * Du kannst diese Klasse nennen, wie du willst. 
	 * Wichtig ist, für den Programmstart -muss diese Klasse die Main-Methode haben
	 */

	public static void main(String[] args) {

	}
}

Und in dieser Klasse kannst du jetzt einen Kreis anlegen.

public class UtilityStart {

	public static void main(String[] args) {
		Kreis kreisKoerper = new Kreis(20);// Kreis mit Radius von 20

	}
}

Und dann kannst du beide Methoden aufrufen und dir die Rückgaben entweder in einer Variable abspeichern.
Oder dir die Rückgaben auf der Konsole sofort ausgeben lassen.

Beginnen wir mit der Methode, welche kein Kreisobjekt benötigt.
Sondern nur die Zahl.

public class UtilityStart {

	public static void main(String[] args) {
		Kreis kreisKoerper = new Kreis(20);

		// Entweder kannst du den Rückgabewert vorher speichern
		double flaecheEins = UtilityKlasse.berechneKreisFlaeche(20);
		System.out.println(flaecheEins);

		// Oder du kannst du den Rückgabewert direkt auf der Konsole ausgeben
		System.out.println(UtilityKlasse.berechneKreisFlaeche(20));
	}
}
  • Falls du den Rückgabewert der Methode zwischenspeichern möchtest, musst du eine lokale Variable vom Datentyp double anlegen.
    double flaecheEins = UtilityKlasse.berechneKreisFlaeche(20);
  • Außerdem kannst du die Methode nicht einfach so aufrufen.
    Denn diese befindet sich schließlich in einer anderen Klasse.
    In diesem Beispiel hieß die Klasse: UtilityKlasse.
    Und deshalb musst du per Punktnotation die Klasse und die Methode direkt ansprechen.
    UtilityKlasse.berechneKreisFlaeche(20)

Probier es einmal auf.
Klicke auf „RUN“ und schau dir die Konsolenausgaben an.

Passt oder?
Dann lass uns die andere Methode aufrufen.
Diese erwartet den Kreis als Argument.

public class UtilityStart {

	public static void main(String[] args) {
		Kreis kreisKoerper = new Kreis(20);

		// Entweder kannst du den Rückgabewert vorher speichern
		double flaecheEins = UtilityKlasse.berechneKreisFlaeche(20);
		System.out.println(flaecheEins);

		// Oder du kannst du den Rückgabewert direkt auf der Konsole ausgeben
		System.out.println(UtilityKlasse.berechneKreisFlaeche(20));

		// Entweder kannst du den Rückgabewert vorher speichern
		double flaecheZwei = UtilityKlasse.berechneKreisFlaeche(kreisKoerper);
		System.out.println(flaecheZwei);

		// Oder du lässt dir den Rückgabewert direkt ausgeben
		System.out.println(UtilityKlasse.berechneKreisFlaeche(kreisKoerper));
	}
}

Klicke auf „RUN“ und los geht’s.
Du solltest jetzt viermal eine Kreisfläche von 1256.637061436 ausgegeben bekommen.

Bis hierhin läuft es.
Du kannst aber Instanzen der Utility-Klasse anlegen.

Java Hilfsklassen Objekte erstellen

Und das ist blöd.
Denn:

  1. Du brauchst kein Objekt, denn alles in dieser Klasse ist statisch.
  2. Die Methoden sind zwar für Objekte geeignet. Aber nicht speziell für Objekte der Klasse UtilityKlasse.
  3. Eine Möglichkeit Objekte aus dieser Klasse zu erstellen, verwirrt dich später vielleicht.

Also lass uns die Instanzierung dieser Klasse unterbinden.

So kannst du das Instanzieren verhindern.

Schau dir nochmal die Utility-Klasse an.

public class UtilityKlasse {
	public final static double PI = 3.14159265359;// Kreiszahl

	//Methode erwartet einen Radius als Zahl
	static double berechneKreisFlaeche(double radius){
		double flaeche= PI*(radius*radius);
		return flaeche;
	}
	
	//Methode erwartet ein Kreisobjekt mit einer Instanzvariablen radius
	static double berechneKreisFlaeche(Kreis kreisEins){
		double flaeche= PI*(kreisEins.radius*kreisEins.radius);
		return flaeche;
	}
}

Wir bieten keinen Konstruktor an. Zumindestens nicht explizit.
Klar- Der default Konstruktor ist dennoch immer dabei.

Und mit diesem Default-Konstruktor kann jede andere Klasse Instanzen dieser Klasse erzeugen.
(Wie ich oben im Bild demonstriert habe.)

Und deshalb darfst du den default-Konstruktor nach außen nicht anbieten.
Das heißt, dieser darf nicht sichtbar sein.

public class UtilityKlasse {
	public final static double PI = 3.14159265359;

	
	static double berechneKreisFlaeche(double radius){
		double flaeche= PI*(radius*radius);
		return flaeche;
	}
	
	
	static double berechneKreisFlaeche(Kreis kreisEins){
		double flaeche= PI*(kreisEins.radius*kreisEins.radius);
		return flaeche;
	}
	
	//Durch das Keywort private kann keine Klasse außerhalb auf diesen zugreifen
	private UtilityKlasse(){
		
	}
}

Aufgrund dessen, dass der Konstruktor jetzt private ist – verbietet die Klasse die Instanzierung von Objekten.

Java Utility Klasse Instanzierung

Der Konstruktor wird nicht mehr nach außen angeboten.
Und ohne Konstruktoraufruf – keine Objekte.

Zusammenfassung:

  • Utility Klassen eignen sich besonders gut, um Methoden – welche vom kompletten Programm genutzt werden sollen, anzubieten.
  • Wichtig ist dabei, dass diese Klassen keine Objekte erzeugen können.
  • Außerdem sollten die angebotenen Methoden und Konstanten dem kompletten Programm und allen Objekten zur Verfügung stehen.

Ähnliche Beiträge

Nutze das Keyword this für deine Java Konstruktoren

Java konstruktoren this

Es ist gemein. Wahrscheinlich hast den Beitrag zu den lokalen Variablen gelesen. Vielleicht hast du auch den Artikeln zum Anlegen und Überladen von Java Konstruktoren gelesen. Und wenn du die beschriebene Inhalte selbst ausprobiert hast…… Dann hast du dir wahrscheinlich sehr viele lokale Variablennamen für die Parameterliste ausdenken müssen.

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

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.

Ohne Abstraktion ergibt Java Polymorphie wenig Sinn

Java Polymorphie Abstraktionsprinzip

Kennst du den Film Matrix? Denn kennst du vielleicht auch die Botschaft, welche der Protagonist am Anfang des Filmes erhält. „Folge dem weißen Kaninchen.“ Und so ähnlich ist es jetzt auch in diesem Beitrag. „Wir dringen immer tiefer in den Kaninchenbau ein.“ 🙂 Ganz so wie im Film wird es nicht. Aber bevor wir mit […]

Java Konsolenausgaben mit formatierten Zahlen

Java Konsolenausgaben Zahlen

Java Konsolenausgaben erzeugst du mit der System.out.println()-Anweisung. Dies ist relativ einfach. Aber es ist mitunter nicht ganz praktisch. Und zwar immer dann, wenn Zahlen im Spiel sind. Die Zahlen welche dann auf deiner Java Konsole erscheinen, sind unformatiert. Sie haben zu viele Kommastellen. Oder für eine bessere Darstellung benötigst du den Tausenderpunkt. Vielleicht möchtest du […]

Java Duales Zahlensystem – Binäre Zahlen in Java umwandeln

Java Dual System

Das duale Zahlensystem hat viele Bezeichnungen. Oft wird auch es Dualsystem oder Binärsystem genannt. Es besteht aber immer aus 2 Zahlen. Man verwendet oft die Zahlen 0 und 1. Es können aber auch sämtliche anderen Zahlenpaare sein. Zum Beispiel 7 und 175 sind für sich genommen, auch ein normales Zahlenpaar und somit ein Dualsystem. Mit […]

So kannst du ein Java Programm starten und Argumente übergeben

Um ein Java Programm starten zu können, benötigst du immer die main-Methode. Das Programm startet immer genau an dieser Stelle. Alle lokalen Variablen, welche du in der Main Methode anlegst, kannst du dann im Programm nutzen. Auch alle Methoden, welche du innerhalb des Methodenrumpfes der main-Methode aufrust, werden ausgeführt. Was ist aber vor der main-Methode. […]

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

Java for Schleifen schachteln – So funktioniert es

Java For Schleifen schachteln

Diese Situation kennst du doch auch…. Du stehst an der Haltestelle und wartest auf den Bus. Dein Blick fällt auf die Uhr.   Oder du wartest an der Ecke auf deinen Freund oder Kollegen. Immer wieder schaust du auf deine Uhr.   Sie ist kaum noch wegzudenken. Die mobile Taschenuhr.   Lange Zeit wurde die […]

So kannst du deine Eclipse Oberfläche anpassen

Eclipse anpassen

In diesem Beitrag möchte ich dir zwei ganz nette Features von Eclipse vorstellen. Es geht um Views und um Perspektiven. Wie du schon weißt, besteht Eclipse aus einer grafischen Oberfläche. Und in dieser Oberfläche stehen dir verschiedene Views zur Verfügung. Was ist so ein View?