2016-07-27 5 views
1

Was ich gelesen habe, ist Unveränderlichkeit bedeutet, dass der einmal zugewiesene Wert konstant bleibt, d. H. Sobald er zugewiesen ist, wird er als derselbe Wert über den Code hinweg reflektiert.Löst Immutability und Singleton den gleichen Zweck?

Meistens wird die Unveränderlichkeit im Functional Programming-Paradigma in Multi-Thread-Umgebungen verwendet.

Aber.

Hat auch Singletonmuster den gleichen Zweck löst unter der Singleton in Java geschrieben,

Bitte zu finden,

package com.main; 

class Student{ 
    private Student(){ 

    } 
    public static Student INSTANCE; 
    static{ 
    INSTANCE = new Student(); 
    } 

    private String name; 

    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 

    @Override 
    public String toString(){  
    return "Student is "+this.name; 
    } 
} 


public class SingletonTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Student student = Student.INSTANCE; 
    student.setName("Arnold"); 

    student = Student.INSTANCE; 
    student.setName("Kevin"); 

    student = Student.INSTANCE; 
    student.setName("Jim"); 

    student = Student.INSTANCE; 
    student.setName("Falcon"); 

    student = Student.INSTANCE; 
    student.setName("Sarvik"); 


    student = Student.INSTANCE; 
    System.out.println(student); 

    } 

} 

Die Ausgabe des obigen Codes ist

Student is Sarvik 

In einer gleichen So, ich habe Singleton auch in javaScript geschrieben,

wie folgt

var Student = (function(){ 
    var name = ""; 
    var obj = { 
    setName : function(studentName){ 
     name = studentName; 
    }, 
    getName : function(){ 
     return name; 
    } 
    } 

    return { 
    INSTANCE : obj 
    } 
})(); 


var student = Student.INSTANCE; 
student.setName("Arnold") 

student = Student.INSTANCE; 
student.setName("Kevin"); 

student = Student.INSTANCE; 
student.setName("Jim"); 

student = Student.INSTANCE; 
student.setName("Falcon"); 

student = Student.INSTANCE; 
student.setName("Sarvik"); 

student = Student.INSTANCE; 

console.log("Student is "+student.getName()); 

der Ausgang als

[email protected]:~/myPractise/JavaScript-DesignPatterns$ node singleton.js 
Student is Sarvik 
[email protected]:~/myPractise/JavaScript-DesignPatterns$ 

Sowohl folgt (d.h. javaScript und java) Implementierung von Singleton Muster Sie können sehen, dass der Zustand des Objekts bleibt gleich, es ändert sich nicht.

Auch wenn wir den Wert des Objekts zurücksetzen, gibt der Ausgang den letzten Reset-Wert.

So verwendet Singleton Muster ich in meinem Code des Objekts "Student" Unveränderlichkeit erreicht?

+1

http: // Stapelüberlauf.com/questions/13784244/sind-all-immutable-objects-singleton-instances – Unknown

+1

Singletonität und Unveränderlichkeit sind orthogonal. Ein Singleton kann veränderlich oder unveränderlich sein; Ein Nicht-Singleton kann veränderbar oder unveränderlich sein. Ein Singleton * muss jedoch * fadensicher sein, wenn er in mehreren Threads verwendet wird. unveränderliche Objekte sind von Natur aus Thread-sicher. –

+1

Ihre 'Student'-Klasse ist eindeutig nicht unveränderbar: Sie haben eine Setter-Methode. –

Antwort

1

Nein: Singleton-Ness und Unveränderlichkeit sind orthogonal. Ein Singleton kann veränderlich oder unveränderlich sein; Ein Nicht-Singleton kann veränderbar oder unveränderlich sein.

Ein Singleton muss jedoch threadsicher sein, wenn er in mehreren Threads verwendet wird. unveränderliche Objekte sind von Natur aus Thread-sicher.


Ihre Student Klasse ist etwa Singleton, aber nicht unveränderlich: jede Klasse in dem Sie eine Setter-Methode, die eine Membervariable mutiert nicht unveränderlich sein kann.

jedoch Ihre Student Klasse ist nicht Thread-sicher oder sogar sicher:

  • Sie den Wert name mutieren können, aber es gibt keine Garantie über die Sichtbarkeit des name Feldes in anderen Threads : Da Sie den Zugriff auf die Variable nicht synchronisieren (oder AtomicReference oder volatile verwenden), ist es möglich, dass ein Thread den Namen aktualisieren kann, aber andere Threads weiterhin den alten Wert sehen. Daher können Sie Thread-Interferenzeffekte beobachten.
  • Es ist möglich, dass Benutzer der Klasse das Feld INSTANCE auf Null setzen, was bedeutet, dass jeder, der versucht, jederzeit auf den Wert des Feldes zuzugreifen, zunächst prüfen muss, ob es null ist. Dies ist leicht zu beheben, indem das Feld final; aber es ist besser, die Klasse einfach zu einer Enumeration mit einem einzelnen Element zu machen.
1

Nicht wirklich.

Unveränderliche Klasse bedeutet auch nicht, dass Sie nicht mehr Objekte derselben unveränderlichen Klasse erstellen können. Für Singleton ist normalerweise eine Instanz pro JVM erforderlich, damit sie als Singleton bezeichnet wird.

Unveränderlich bedeutet, dass der einmal zugewiesene Wert nicht geändert werden kann. In der Regel werden Sie keine Setter-Methoden in immutable haben, aber keine solche Anforderung für Singleton. Aber ein Singleton ist mehr aus der Gedächtnisperspektive, nur eine Instanz wird leben. Sie können die Instanz nicht ändern, aber Sie können den Singleton verwenden, um den gewünschten Wert beizubehalten, und Sie können ihn auch jederzeit ändern.

z.B. Wir haben die Singleton-Klasse als Service Locator verwendet. Wir könnten die Dienstleistungen zu jedem beliebigen Zeitpunkt ändern, je nach Bedarf. Für die gleiche Sache kann ich 2 Objekte der unveränderlichen Klasse mit den gleichen Variablen herstellen, aber unterschiedliche Werte halten.

Hoffe, das hilft.

0

Zunächst ist das Singleton-Beispiel, das Sie angegeben haben, kein Singleton.

Die Singleton-Muster zwingen Sie, nur ein Objekt pro Klasse in der gesamten Anwendung zu verwenden. In Ihrem Beispiel kann man so viele Objekte wie möglich erstellen.

Das Erzwingen der Erstellung einzelner Objekte kann mit Hilfe des privaten Konstruktors erreicht werden, indem jedesmal 'INSTANCE' bereitgestellt wird, wenn die Anfrage für das Objekt mit Hilfe einer statischen Methode, zB getInstance(), zu dieser Klasse kommt.

Unveränderlichkeit hat einen anderen Zweck. Es bezieht sich hauptsächlich auf die Sicherheit eines Objekts, z. Sobald das Objekt erstellt wurde, können Sie seinen Status nicht ändern.

Es ist offensichtlich, dass Sie den Zustand beim Erstellen dieses Objekts bereitstellen müssen. Ich meine, Sie benötigen einen parametrischen Konstruktor, um diesem Objekt einen permanenten Zustand zuzuweisen.

So grundlegende Unterschied ist:

Singleton: Sie können nicht in jedem Fall mehr als ein Objekt haben kann (im Gegensatz zu unveränderliches Objekt, Sie sind nicht auf Zustandsänderung beschränkt, sondern meist sind wohl nicht Singleton-Objekt des Staates zu ändern.)

Unveränderlichkeit: Sie können nicht den Zustand des Objekts auf jeden Fall ändern, aber Sie können so viele bezwecken als ;-) Haufen erlaubt

+0

Ich habe Student Konstruktor privat in meiner Java-Implementierung –

+0

gemacht Ohh großartig! Ignoriere dann die erste drei Zeile meiner Antwort. Hoffe ihr findet 7-3 = 4 Zeilen hilfreich ;-) – vvtx

0

Sie Studentenklasse aber unveränderlich ist. Das öffentliche setName() der Student-Klasse verhindert, dass Zustände unveränderlich sind. Ein unveränderliches Objekt bietet keine Möglichkeit, seinen Status zu ändern.

Wenn Ihr Objekt unveränderlich war, konnte Ihre Schülerinstanz Student.INSTANCE ihren Namen nicht ändern. Aber Sie ändern seinen Namen mehrmals. Und Ihre systemOut am Ende bestätigt die Veränderlichkeit: der Nachname "Setted" wird durch die toString() Methode angezeigt.

Student student = Student.INSTANCE; 
student.setName("Arnold"); 

student = Student.INSTANCE; 
student.setName("Kevin"); 

student = Student.INSTANCE; 
student.setName("Jim"); 

student = Student.INSTANCE; 
student.setName("Falcon"); 

student = Student.INSTANCE; 
student.setName("Sarvik"); 


student = Student.INSTANCE; 
System.out.println(student); 

Außerdem, wenn ein unveränderliches Objekt will Zustand Modifikationen bezogene Operationen zur Verfügung zu stellen, wird es nicht auf die Instanz selbst anwenden, es gibt vielmehr eine neue Instanz des Objekts mit diesem neuen Zustand.

Verwandte Themen