Frage von Toaster143, 48

Wie nutzt man die Objektorientierung in Java richtig?

Hallo,
ich wollte ein Programm in Java schreiben und hatte eine Frage zur Objektorientierung.

Angenommen: ich schreibe ein Programm mit mehreren Klassen und der GUI Swing oder ähnlichem.
Die alle brauchen eine Methode, die für alle zugänglich sein soll.

Beispiel:
Wenn das Programm z.B. einen Ordner, eine Datei anlegen soll,
( das könnte fast in jeder der Klassen fast einmal passieren) soll ich dann entweder:

1. Die Methode einfach in jede Klasse schreiben.
2. Sowas wie eine Dateimananger-Klasse schreiben die allen irgendwie bekannt werden muss.
3.Eine static Hauptklasse schreiben mitsamt universell-static-Methode die somit auch jedem bekannt werden muss (und von der man anscheinend keine neuen Instanzen erzeugen kann).

Also irgendwie bin ich etwas verwirrt, wahrscheinlich ist es sehr einfach aber dazu noch eine Zusatzfrage:
Wie strukturiert ihr eure Java Programme?

Vielen Dank fürs Lesen,
Ich hoffe ihr könnt mir helfen

Antwort
von Mikkey, 33

Es gibt dafür drei Muster (deinen Punkt 1 ignoriere ich einfach mal):

1. Singleton: Eine Instanz der Klasse wird mithilfe einer statischen Methode einmal erzeugt und dann immer zurückgegeben

2. Statische Klasse

3. Erzeugen der Instanz jeweils wenn man sie braucht. Dabei lassen sich Fehlerresultate insbesondere in mehrsträngigen (Multithreading) Anwendungen besser behandeln.

Kommentar von Toaster143 ,

Danke für die schnelle Antwort!
Das werde mich mir nochmal genauer ansehen.
Was würdest aus persönlicher Erfahrung empfehlen, wenn es um Sauberkeit und Laufzeit geht?
Vielen Dank!

Kommentar von Mikkey ,

Ich würde inzwischen (jedenfalls beim Datei/Verzeichnis-Handling) zu der dritten Variante tendieren.

- Singleton ist vielfach verpönt. Trotzdem verwende ich es dort, wo es fachlich sinnvoll ist. Beispiel: Protokollierung.

- Statische Klassen sind eigentlich nichts anderes als herkömmliche Funktionen, die man in einem Modul zusammengefasst hat.

Antwort
von phigeek, 24

Ich würde für den File-Zugriff Deine 2. Methode vorschlagen. Du brauchst aber diese Datei-Manager Klasse nicht allen bekannt zu machen. Es reicht, wenn Du die Funktionalitäten brauchst, ein Objekt dieser Klasse zu instanzieren und die Methoden darauf anzuwenden.

Damit sich die Aufrufe nicht in die Quere kommen kannst Du diese Methoden statisch machen oder die Files sonst irgendwie blockieren. Eine weitere Vorgehensweise ist der Singleton: Siehe Seite 158 hier: http://www.programmieraufgaben.ch/uploads/oo.pdf

PS: Die Delegation ist eines der wichtigsten Konzepte, damit Klassen (genauer Objekte dieser Klassen) miteinander kommunizieren können. Auch in obigem PDF zu finden (dort Kap. 17 ab Seite 61).

Kommentar von Toaster143 ,

Vielen Dank für die schnelle Antwort!
Das kam mir auch so ähnlich in den Sinn hatte aber bisher nur selten was schriftliches darüber gefunden.
Hast du persönliche Erfahrungen gemacht was sich am saubersten und schnellsten verhält oder was du wann anwenden würdest?

Vielen Dank!

Kommentar von phigeek ,

Der Singleton funzt wie folgt (aber auch die statische Variante, die Du erklärst funktioniert, ist aber nicht objektorientiert, dafür evtl. etwas rascher in der Ausführung):

import java.io.File;

public class DateiZugriff {

private static DateiZugriff singleton;

private DateiZugriff() {
}

public static DateiZugriff getDZInstance() {
if(null == singleton) {
DateiZugriff.singleton = new DateiZugriff();
}
return singleton;
}

public synchronized File legeDateiAn(String filename) {
return null; // TODO Hier ein File anlegen
}

public synchronized File legeOrdnerAn(String ordnerName) {
return null; // TODO Hier einen Ordner anlegen
}

} // end of class DateiZugriff

Nutzen kannst Du den Singleton dann wie folgt:

public class Nutzklasse {

public static void main(String[] args) {
new Nutzklasse().top();
}

void top() {
// File anlegen:
DateiZugriff.getDZInstance().legeDateiAn("Gugus.txt");
// Ordner anlegen
DateiZugriff.getDZInstance().legeOrdnerAn("blahblah");
}
} // end of class Nutzklasse

Keine passende Antwort gefunden?

Fragen Sie die Community