Vererben von Singleton

usrr

Bekanntes Mitglied
Hallo,

ich habe eine Basisklasse Modul, die vererbt werden kann. Alle abgeleiteten Modul-Klassen, sollen nur einmal existieren können, also Singeltons sein. Ich möchte diesen Mechanismus aber nur in der Basisklasse implementieren:

Java:
public class Module  {

	private static Module instance;

	private Module() {
	}
	
	public static BaseModule getInstance() {
		if ( instance == null ) {
			instance = new Module();
		}
		return instance;
	}
}

Erstens werden die statischen Elemente nicht vererbt und selbst wenn, dann hätte "instance" immer den Type Module und nicht AbcModule.

Gibt es dafür eine Lösung?
 
M

maki

Gast
Klingt doch gut, wozu dann diese Idee mit den vererbaren Singletons?

Einfach nur um ein "Design Pattern" einzusetzen? ;)
 

usrr

Bekanntes Mitglied
Eine Alternative wäre es gewesen, die Funktionalität statisch zu implementieren. Das hääte bei den meisten Modulen auch funktioniert. Allerdings habe ich mir als Ziel gestezt, (und das tatsächlich um zu lernen) dass Module bzw. Funktionalität später hinzugefügt werden soll, ohne die Hauptklasse ändern zu müssen.

Das Singelton ist nicht 100% notwenig, weil ich ja drauf achten könnte Module nicht doppelt zu benutzen. Aber trotzdem will ich sehen was machbar ist.

Fazit: Ja, im Prinzip einfach um es auszuprobieren.
 
M

maki

Gast
Tipp: Vergiss Singleton ganz schnell wieder.

Macht man in der Realtität sehr selten, und niemals vererbar ;)

Wen du was relevantes probieren möchtest, versuchs doch mal mit Google Guice.
 
G

Gast2

Gast
Falls die Module keine Abhängigkeiten haben könntest du folgendes versuchen:

Java:
public abstract class Module  {
 
    private static Map<Class<? extends Module>, Module> instances = new HashMap<>();
 
    public static <T extends Module> T getInstance(Class<T> clazz) {
        if (!instances.containsKey(clazz)) {
        	try {
        		T instance = clazz.newInstance();
        		
        		instances.put(clazz, instance);
        	} catch (InstantiationException | IllegalAccessException ex) {
        		ex.printStackTrace();
        	}
        }
        
        return clazz.cast(instances.get(clazz));
    }
    
    public static void main(String[] args) {
		ModuleA moduleA = Module.getInstance(ModuleA.class);
		System.out.println(moduleA);
	}
}

class ModuleA extends Module {}

class ModuleB extends Module {}
Falls dir als Typ Module ausreicht und du nicht den konkreten Typ brauchst, kannst du auf den Cast mit dem Class Objekt auch verzichten.

Aber naja, das ist schon sehr wirr.
 

usrr

Bekanntes Mitglied
Evtl. gibt es noch andere Möglichkeiten. Z.B,. hatte ich überlegt, den Konstruktor auf protected zu setzen und die Module ins gleiche Verzeichnis, wie den Verwalter zu speichern. Allerdings dürfte das der Übersicht nicht gerade dienen :). Auch bräcuhte man später bei Erweiterungen Zugriff auf das entsprechende Verzeichnis.

Möglich wäre aber auch in den Verwalter eine Factory einzubauen, die die Module auf verlangen erzeugt. Dort könnte dann geprüft werden, ob schon eine Instanz existiert. Aber die Module wären dann, auch nicht geschützt, so dass eigentlich nichts gewonnen wurde.
 

Lit-Web

Aktives Mitglied
@EikeB

Kannst du mir bitte verraten was diese Zeile macht, was es damit auf sich hat? Hat das was mit Templates zu tun so wie es sie in C++ gibt?

Java:
private static Map<Class<? extends Module>, Module> instances = new HashMap<>();

Danke für eine kurze Erläuterung, ich kann nicht wirklich was damit anfangen.
 
G

Gast2

Gast
Dann musst du zwei Sachen ändern:

Java:
private static Map<Class<? extends Module>, Module> instances = new HashMap<>();
=>
Java:
private static Map<Class<? extends Module>, Module> instances = new HashMap<Class<? extends Module>, Module>();

Java:
} catch (InstantiationException | IllegalAccessException ex) {
  ex.printStackTrace();
}
=>
Java:
} catch (InstantiationException ie) {
  ie.printStackTrace();
} catch (IllegalAccessException iae) {
  iae.printStackTrace();
}

Das erste nennt sich diamond operator und spart einem das doppelte hinschreiben der generics. Mit dem zweiten kann man mehrere exceptions catchen und spart sich das doppelte
Code:
printStackTrace()
.
 
S

Spacerat

Gast
Hier könnte man eigentlich schon wieder 'ne Grundsatzdiskussion anzetteln, aber das ist nicht meine Intention. ;)
Dein Vorhaben ist mit Singletons nicht durchführbar, das Pattern, dass du suchst muss anders heissen. Singletons sind Klassen, die sich nur einmal instanzieren lassen (sollten). Das impliziert, dass sie im Grunde genommen finale Klassen sind, auch wenn sie nicht als solche deklariert wurden. Das bedeutet aber nicht, dass Singletons keine anderen Klassen erweitern können, an dieser Stelle nenne ich gern das Beispiel Service. Davon gibt es bekanntlich viele, aber pro Port halt nur einen. Das Beispiel hinkt evtl. an der Tatsache, dass es auch multiinstanzfähige Dienste gibt, aber das wären dann auch keine Singletons mehr. Das Singleton wird viel zu oft mit anderen verwechselt und so kommt es dann zu diesen Grundsatzdiskussionen. Das ist auch kein Anti-Pattern, sondern man muss wissen, wann man eines benötigt. Gründe für die Wahl des Singleton-Pattern sind allerdings so rar geworden, dass man schon zu hinkenden Beispielen greifen muss, weil einem selber keiner mehr einfällt, wenn man's erklären will.
Eine Möglichkeit für dich wäre also deine Klasse Modul abstrakt zu machen und erst die konkreten Klassen zu "Singletons". Das wäre dann eine Art Factory-Pattern, würd' ich sagen.
 
Zuletzt bearbeitet von einem Moderator:

usrr

Bekanntes Mitglied
Das bringt mich wieder an die Stelle, die mich schon etwas länger beschäftigt.

Das Module hat einen Konstructor Modul(Owner owner). Obwohl ich in den abgeleiteten Modulen nichts am Konstructor ändere, muss ich jedesmal einen neuen angeben, der über super() den alten Aufruft. Setzte ich den Konstruktor jetzt auf private, geht das nicht mehr und ich muss einen Default-Konstruktor anlegen, was ich eigentlich nicht will.
 
S

Spacerat

Gast
Dann setz' den Konstruktor genau in die Mitte von public und private, sprich auf protected. Die Klasse Modul deklarierst du noch als abstrakt und schon lässt sie sich nur noch von Kind-Klassen instanzieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fiedelbambu Vererbung JTabbedPane vererben in der MainView Java Basics - Anfänger-Themen 0
M Vererbung Enums vererben Java Basics - Anfänger-Themen 1
T Objekte in Listen vererben Java Basics - Anfänger-Themen 3
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
B static individuell "vererben"? Java Basics - Anfänger-Themen 8
M Vererben von Superklasse ohne Konstruktor Java Basics - Anfänger-Themen 9
B Datentypen Enum vererben/gruppieren? Java Basics - Anfänger-Themen 6
B Vererbung Designproblem beim Vererben Java Basics - Anfänger-Themen 3
Luk10 Vererben großer Interface-Methoden Java Basics - Anfänger-Themen 13
V OOP Statische Klassen-Attribute vererben Java Basics - Anfänger-Themen 4
M OOP GUI - Fenster vererben? Java Basics - Anfänger-Themen 9
K Methode vererben bei überschriebenem Konstruktor? Java Basics - Anfänger-Themen 14
C Liste mit Attribut Abstract vererben Java Basics - Anfänger-Themen 11
T OOP Klassenimport "vererben" Java Basics - Anfänger-Themen 2
A Statische Methode "vererben" - Zwang durch annotation processor Java Basics - Anfänger-Themen 10
Luk10 Vererben von private instanzvariablen Java Basics - Anfänger-Themen 20
T enum-Methoden "vererben" Java Basics - Anfänger-Themen 11
J Probleme beim Vererben Java Basics - Anfänger-Themen 2
Y Vererben - Konstruktoren Java Basics - Anfänger-Themen 2
P Attribute Vererben Java Basics - Anfänger-Themen 2
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
W Sinn eines Singleton ? Java Basics - Anfänger-Themen 14
O Singleton Java Basics - Anfänger-Themen 5
R Methode in Singleton Klasse Java Basics - Anfänger-Themen 1
O Singleton Verständnis Java Basics - Anfänger-Themen 4
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Singleton (Design Patterns) Java Basics - Anfänger-Themen 16
R OOP Singleton Java Basics - Anfänger-Themen 10
S Singleton - Daten einspielen Java Basics - Anfänger-Themen 5
K Warum ist ein Singleton kein Best Practise? Java Basics - Anfänger-Themen 3
M Singleton mit Parametern im Konstruktor Java Basics - Anfänger-Themen 18
D Singleton beim JFrame zerstören Java Basics - Anfänger-Themen 4
L Java Serialisierung Singleton Java Basics - Anfänger-Themen 6
A JBoss-Anwendung soll im Singleton-Mode laufen Java Basics - Anfänger-Themen 6
Luk10 Problem mit Singleton bzw statischer Referenz! Java Basics - Anfänger-Themen 16
S Instanz(en) einer Singleton-Klasse Java Basics - Anfänger-Themen 11
S Statische Klassen/ Singleton Java Basics - Anfänger-Themen 13
J Warum verwendet man Singleton? Java Basics - Anfänger-Themen 7
B Was ist der unterschied zwischen Singleton und Strategy? Java Basics - Anfänger-Themen 6
S Singleton lazy Java Basics - Anfänger-Themen 8
A ist das ein Singleton-Pattern? Java Basics - Anfänger-Themen 6
P Singleton-Implementation Java Basics - Anfänger-Themen 8
F singleton Java Basics - Anfänger-Themen 4
T Singleton Java Basics - Anfänger-Themen 13
Antoras Singleton oder Controller / Datenverwaltungsklasse? Java Basics - Anfänger-Themen 10
D Objekte anlegen und Singleton Pattern Java Basics - Anfänger-Themen 21
D Denkfehler Singleton Java Basics - Anfänger-Themen 53
X Singleton - In diesem Fall sinnvoll? Java Basics - Anfänger-Themen 22
S Fragen zu synchronized + Singleton! Java Basics - Anfänger-Themen 10
M Singleton Pattern Java Basics - Anfänger-Themen 35
J Singleton Pattern Java Basics - Anfänger-Themen 5
S Singleton Pattern passend hierfür? Java Basics - Anfänger-Themen 60
M Mp3 Player mit Singleton Java Basics - Anfänger-Themen 8
M GUI als SingleTon Java Basics - Anfänger-Themen 6
B Singleton und Resourcebundle Java Basics - Anfänger-Themen 7
G Singleton Pattern Java Basics - Anfänger-Themen 7
D Singleton in Java implementieren Java Basics - Anfänger-Themen 6
H singleton Synchronisations Problem? Java Basics - Anfänger-Themen 2
M Singleton verwenden, aber wie? Java Basics - Anfänger-Themen 3
H Singleton mit Attributen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben