Singleton Frage:

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo, angenommen ich habe diese SingletonKlasse:

Code:
public class Singleton {

    private static Singleton instance = null;
    private static Map<Object,Object>values;

    private Singleton () {}

    public static synchronized Singleton getInstance() {

        if (instance == null) {
            instance = new Singleton ();
        }
        return instance;
    }

   public static Map<Object,Object>getValues(){
      //mach irgendwas mit values und gib diese zurück
     return values;
   }
}


Nun möchte ich diese Klasse irgendwo aufrufen. Wo ist nun der Unterschied bei den beiden Aufrufen ?

Variante 1:

Code:
Singleton.getInstance().getValues();

Variante 2:
Code:
Singleton.getValues();

Und: würde etwas dagegen sprechen, die values Map public zu machen und dann von außerhalb einfach so aufzurufen:

Code:
Singleton.values;



Vielen Dank schonmal für nützliche Hinweise!
Mit besten Grüßen
Christian
 

CK

Aktives Mitglied
Public ist grundsätzcih schlecht. In ganz wenigen ausnahmefällen sollte man eine variable public machen (Thema Datenkapselung).

Singleton.getValues() da müsste die Methode static sein und somit muss kein Object der Klasse initiert werden.

Singleton.getInstance().getValues() greift auf ein über das einzige Object auf die Methode zu. In deinen Fall aber sinnlos weil die Methode static ist

Dein oberer Code solltest du also nochmal überdenken.
Zu empfehlen wer, wenn die Klasse schon Singleton ist, die Variablen auch Singleton zu machen oder du sparst die das Singleton und greifst direkt auf die Variablen mit getter und setter zu (static, aber besser nicht public Variablen).

Die erste Variante ist allerdings die eleganterer.

Gruß.
 

Wildcard

Top Contributor
1. Singeltons sind fast immer böse
2. Vergiss sowas am besten wieder:
Code:
        if (instance == null) {
            instance = new Singleton ();
        }
Straight Forward:
Code:
private static Singleton instance = new Singelton();
 

CK

Aktives Mitglied
Singleton ist in manchen Fällen ganz sinnvoll. Ein Beispiel wäre die Gui Entwicklung. Hier will man oft nur das z.B. ein Frame nur einmal vor kommt. Hierfür wäre Singleton gut.
 

Wildcard

Top Contributor
Bis man merkt das man doch 2 Frames möchte und dann schreibt man das halbe Programm um. Man gewinnt durch das Singelton nichts und verliert seine Flexibilität.
 
G

Guest

Gast
Gut...Warum Singleton. So lautet halt die Aufgabenstellung...
Ok, Code ist abgeändert, aber wie wird die Map zum Singleton, so wie jetzt ist ?:

Code:
public class Singleton {

    private static Singleton instance = new Singleton();
    private static Map<Object,Object>values = new HashMap<Object,Object>();

    private Singleton () {}

    public static synchronized Singleton getInstance() {
        return instance;
    }

   public static Map<Object,Object>getValues(){
     return values;
   }
}
 

CK

Aktives Mitglied
Singleton ist wenn schon die Klasse und nicht die Map.
Aber wenn ich dich richtig verstehe willst du nur eine Instanz von der Map mit einem einzigen Object.
Das würde bedeuten das du nur das static vor map (Variable und Methode) wegnehmen musst.
 

CK

Aktives Mitglied
Um zu wissen ob eine bestimmte Oberfläche nur einmal oder mehrfach existiern soll, plant man seine Programme ja auch.
Jede Technik hat ihre vor und Nachteile. Als grundsätzlich schlecht würde ich Singleton nicht abhaken.
Besonders wenn es um Speicherlast geht.
 

Wildcard

Top Contributor
Speicherlast? Wenn du ein Objekt nur einmal anlegst, ist es genauso oft vorhanden wie bei einem Singelton. Der unterschied: Ein normales Objekt kann vom GC kassiert werden, ein Singelton setzt sich im Speicher fest, was ist also besser?
 
G

Guest

Gast
Danke für die schnelle Hilfe! Aber ich glaube ich bin jetzt verwirrt..Dies sei nun meine Klasse

Code:
public class Singleton {

    private static Singleton instance = new Singleton();
    private Map<Object,Object>values = new HashMap<Object,Object>();

    private Singleton () {}

    public static synchronized Singleton getInstance() {
        return instance;
    }

   public Map<Object,Object>getValues(){
     return values;
   }

}


Wie instanzier ich nun ein Objekt dieser Klasse , was ist korrekt ?
Code:
private static Singleton singleton = Singleton .getInstance();
oder
Code:
private Singleton singleton = Singleton .getInstance();
 

byte

Top Contributor
Das einzige Problem am Singleton ist, dass man dank statischer Zugriffsmethode von überall an das Objekt dran kommt. Das kann schnell chaotische Auswüchse annehmen, wenn man von zig Stellen im Code die Singletons verwendet. Ganz schlimm wirds, wenn dann noch Singletons auf andere Singletons zugreifen oder wenn man später das Projekt in mehrere Java-Projekte (oder Plugins) umstrukturieren möchte. Da handelt man sich sehr schnell sehr unschöne zyklische Abhängigkeiten ein.

Aus diesem Grund sollte man in den meisten Fällen auf Singletons verzichten. Nur weil nur eine Instanz einer Klasse denkbar sind, muss man nicht zwangsläufig ein Singleton draus machen. Ganz pragmatisch könnte man einfach nur eine Instanz davon erzeugen und in der Doku entsprechend darauf verweisen, dass nur eine Instanz der Klasse Sinn macht.

Ansonsten gibt es auch andere Möglichkeiten, Singletons ohne statische Zugriffsmethode zu implementieren:

Code:
public class BetterSingleton {
    private static boolean exists = false;
    
    public BetterSingleton() {
        if (BetterSingleton.exists) {
            throw new RuntimeException();
        }
        BetterSingleton.exists = true;
    }
}
 

CK

Aktives Mitglied
Ich sag ja kommt auf den Anwendungsfall an.
Haste zum Beispiel einen Listener gebaut der nix berauschendes macht aber an tausend verschiedenen Stellen im Programm benötigt wird, müsstest du die ganze Zeit die Referenz aufbewahren usw..
Also würden vermutlich vielen einfach jedesmal einen neuen Listener erstellen.
Und 100 mal nix berauschendes kann doch was speicherlastiges werden.
In dem Fall könnte man ein Singleton verwenden.

Was ich damit sagen will. Man kann jetzt wahrscheinlich viele Argumente für Singleton finden und genau soviele dagegen.
Einen gescheiten Fall zum einzatz gibt es immer.

Man muss für alles offen sein und öfter mal auch andere Möglicheiten in Betracht ziehen.
 

byte

Top Contributor
CK hat gesagt.:
Was ich damit sagen will. Man kann jetzt wahrscheinlich viele Argumente für Singleton finden und genau soviele dagegen.
Einen gescheiten Fall zum einzatz gibt es immer.
Ich gebe Dir ja insofern recht, dass der akademische Sinn und Zweck eines Singletons das Pattern durchaus rechtfertigt. Nicht ohne Grund findet man das Pattern im bekannten Buch der GOF. Aber die Praxis hat halt gezeigt, dass das Pattern häufig mißbraucht wird, um sich die Arbeit zu ersparen, Referenzen zu übergeben. Das macht das Singleton zum Antipattern.

Sicherlich kann man Speicher sparen, indem man nur 1 Objekt einer Klasse erzeugt statt viele. Aber das kann ich auch bewerkstelligen, ohne die bekannte Singleton-Antipattern Implementierung zu verwenden.

Eine alternative Implementierungsmöglichkeit des Singletons ohne statische Zugriffsmethode habe ich ja auf Seite 1 gepostet.
 

tfa

Top Contributor
CK hat gesagt.:
Ich sag ja kommt auf den Anwendungsfall an.
Haste zum Beispiel einen Listener gebaut der nix berauschendes macht aber an tausend verschiedenen Stellen im Programm benötigt wird, müsstest du die ganze Zeit die Referenz aufbewahren usw..
Also würden vermutlich vielen einfach jedesmal einen neuen Listener erstellen.
Und 100 mal nix berauschendes kann doch was speicherlastiges werden.
In dem Fall könnte man ein Singleton verwenden.
Nettes Beispiel für ein Anti-Pattern. Nennt man glaub ich "Außerirdische Spinne". Ein globales Objekt, das von der ganzen Welt benutzt wird. Wenn es verändert wird, hat das auf 1000 Stellen Auswirkungen.

Man muss für alles offen sein und öfter mal auch andere Möglicheiten in Betracht ziehen.
Für dieses Beispiel empfehle ich einen Event-Bus.
 

Wildcard

Top Contributor
An denen Stellen an denen ein Singelton Sinn machen könnte und garantiert keinen Schaden anrichten kann (das sind äusserst wenige Stellen), bin ich zu folgendem Konstrukt umgeschwenkt.
Eine Klasse hält eine Instanz auf sich selbst und eine statische Zugriffsmethode für diese Instanz. Anderes als bei einem Singelton jedoch nicht getInstance, sondern getDefault.
Der Konstruktor ist im Gegensatz zu Singeltons nicht private, sondern public.
Damit hat man das, was die meisten mit einem Singelton bezwecken wollen (einfachen Objektzugriff) und gleichzeitig ein wenig den 'bad smell' entfernt.
Dennoch muss auch diese Variante mit Bedacht und sehr sparsam eingesetzt werden, weil globaler Zugriff nunmal das Gegenteil von Kapselung ist
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Volatile Frage: Reicht es nur den Singleton als volatile zu deklarieren? Allgemeine Java-Themen 4
M Java Garbage Collector Frage (Singleton Pattern) Allgemeine Java-Themen 13
E Frage zu Singleton Allgemeine Java-Themen 22
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
J Singleton Allgemeine Java-Themen 5
Z deserialize singleton Allgemeine Java-Themen 9
A Singleton threadsafe Allgemeine Java-Themen 8
S Singleton Instanz löschen Allgemeine Java-Themen 5
A Datei als Object einlesen und das Object als Singleton instance setzen. Allgemeine Java-Themen 13
T ActionListener und Singleton Allgemeine Java-Themen 15
S Singleton Entwurfsmuster Allgemeine Java-Themen 20
T So eine Art Singleton-Factory? Allgemeine Java-Themen 3
S Singleton-Klasse und ThreadLocal-Klasse von abstrakter Klasse ableiten? Allgemeine Java-Themen 2
S Singleton hier sinnvol? Allgemeine Java-Themen 20
T Zugriff auf Singleton verkürzen - Namespaces?? Allgemeine Java-Themen 20
Iron Monkey Singleton mit Parameter Allgemeine Java-Themen 14
M Singleton und Vererbung? Allgemeine Java-Themen 45
R Wo initilisiere ich eine Liste in einem Singleton? Allgemeine Java-Themen 2
B Generisches Singleton implementieren Allgemeine Java-Themen 12
H Singleton und MultiThreading [erledigt] Allgemeine Java-Themen 3
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
P SingleTon Allgemeine Java-Themen 5
M zwei Threads - ein singleton-Objekt Allgemeine Java-Themen 3
RaoulDuke Agent als Singleton Thread Allgemeine Java-Themen 7
S singleton vs. static Allgemeine Java-Themen 7
P Singleton vs static Allgemeine Java-Themen 19
K Singleton vererben Allgemeine Java-Themen 15
E Singleton vererben Allgemeine Java-Themen 10
D Design Pattern: Singleton Allgemeine Java-Themen 4
K Sequenzdiagramm für Singleton-Muster Allgemeine Java-Themen 5
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Frage regex greater than less than Allgemeine Java-Themen 7
berserkerdq2 Frage zu IntelliJ und JavaFX Allgemeine Java-Themen 1
W Timer Konzept-Frage Allgemeine Java-Themen 16
T Eine Frage des Designs Allgemeine Java-Themen 2
C Frage zu eigenem TableCellRenderer Allgemeine Java-Themen 11
C Programmvorstellung & Frage zum Thema Geschäftsform Allgemeine Java-Themen 51
J Frage zu System.getproperties. Allgemeine Java-Themen 60
molat100 wie kann man die Frage beantworten Allgemeine Java-Themen 1
pkm Frage zur Präzision von Calendar.WEEK_OF_YEAR Allgemeine Java-Themen 12
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
F Frage zu System.in Allgemeine Java-Themen 3
marcooooo Frage zum Beispiel im Anhang Allgemeine Java-Themen 16
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
B For-Loop Frage Allgemeine Java-Themen 21
L Java frage Allgemeine Java-Themen 3
bueseb84 Frage zu Mock und UpperBound Allgemeine Java-Themen 2
M Frage zum Konstruktor Allgemeine Java-Themen 2
W Best Practice Frage zur Umsetzung MVC Allgemeine Java-Themen 9
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
B Frage zu Unit-Tests Allgemeine Java-Themen 6
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
R Allgemeine Frage zu RMI bei MVC Allgemeine Java-Themen 2
O Frage zum Runtimeverhalten von Java ... Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
D Frage zu Vererbung Allgemeine Java-Themen 5
J Frage zu regulärem Ausdruck Allgemeine Java-Themen 2
M Allgemeine Frage: Wie lernt man Java / Programmieren von Grund auf? Allgemeine Java-Themen 7
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Frage zur JLS Allgemeine Java-Themen 0
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
A Methoden Allgemeine Java Frage Allgemeine Java-Themen 3
E String Frage Allgemeine Java-Themen 9
I bin neu bei GitHub, Frage zur Sicherheit Allgemeine Java-Themen 14
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
C KeyListener Frage Allgemeine Java-Themen 3
T Frage zu UML in Java programmieren Allgemeine Java-Themen 1
R Konstanten initialisieren - FRAGE Allgemeine Java-Themen 3
MTJ004 FTP Frage zu FTP Speicherung Java-Android-FTP Allgemeine Java-Themen 5
J Frage zum Entwurf / json-Datenmodell Allgemeine Java-Themen 8
A Frage zu meinem Code Allgemeine Java-Themen 2
RalleYTN Classpath Nur ne kleine Frage zur MANIFEST.MF Allgemeine Java-Themen 4
T Frage zu Access Modifiers Allgemeine Java-Themen 6
W Input/Output Frage zu pdfbox und FileUtils Allgemeine Java-Themen 2
O Frage zur Implementierungsweise Allgemeine Java-Themen 4
B Frage zu Bitshift Allgemeine Java-Themen 3
J Java Zufallsgenerator (6 aus 49) Frage Allgemeine Java-Themen 7
L Frage zu RIA und GWT Allgemeine Java-Themen 0
P Concurrency Frage Allgemeine Java-Themen 8
M Frage zu Enumerations Allgemeine Java-Themen 2
F Unlimited Strength Policy. Frage Verbreitung der Anwendung Allgemeine Java-Themen 1
F Frage zur Library JTS Allgemeine Java-Themen 5
S Java Design Frage Allgemeine Java-Themen 10
E Reflection? Frage Allgemeine Java-Themen 4
C FileInputStream frage Allgemeine Java-Themen 6
G Polymorphie Programmdesign Frage Allgemeine Java-Themen 20
Uzi21 Frage zu NetBeans ( Console) Allgemeine Java-Themen 11
D Classpath Frage zum Java Resource Loading Allgemeine Java-Themen 2
G Frage zu JPA Allgemeine Java-Themen 1
S Methoden Frage Allgemeine Java-Themen 2
P MVC - Frage zu Model Allgemeine Java-Themen 4
K Frage zu Locks Allgemeine Java-Themen 1
S Frage zu abstract Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben