2016-07-27 1 views
1

То, что я прочитал, является неизменностью, означает, что значение, назначенное после этого, остается постоянным, то есть когда оно назначено, оно отражается как одно и то же значение в коде.Реализует ли неизменность и Singleton ту же цель?

В большинстве случаев неизменность используется в парадигме функционального программирования в многопоточной среде.

Но.

ли синглтон шаблон также решает ту же цель,

Вы найдете ниже одноэлементных написано в Java,

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); 

    } 

} 

Выход выше код

Student is Sarvik 

В же Кстати, я написал singleton в javaScript, а также,

следующим образом

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()); 

выход следующим

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

В обоих (т.е. javaScript и java) реализация шаблона Singleton вы можете видеть, что состояние объекта остается таким же, оно не изменяется.

Даже если мы сбросим значение объекта, , результат выдаст самое последнее значение сброса.

Так как с использованием шаблона Singleton я достиг неизменности в моем коде объекта «Студент»?

+1

http: // stackoverflow.com/questions/13784244/are-all-immutable-objects-singleton-экземпляры – Unknown

+1

Одиночный и неизменяемый ортогональны. Одноэлемент может быть изменчивым или неизменным; не одиночный может быть изменчивым или неизменным. Тем не менее, singleton * должен быть * потокобезопасным, если он используется в нескольких потоках; неизменяемые объекты по своей сути являются потокобезопасными. –

+1

Ваш класс 'Student' явно не является неизменным: у вас есть метод setter. –

ответ

1

No: singleton-ness and immutability являются ортогональными. Одноэлемент может быть изменчивым или неизменным; не одиночный может быть изменчивым или неизменным.

Однако одноэлемент должен быть потокобезопасным, если он используется в нескольких потоках; неизменяемые объекты по своей сути являются потокобезопасными.


Ваш Student класс примерно синглтон, но не неизменны: любой класс, где у вас есть метод установки, который мутирует переменную-член не может быть неизменны.

Однако ваш Student класс не поточно-, или даже сейф:

  • Вы можете мутировать значение name, но нет никакой гарантии, о видимости name поля в других потоках : потому что вы не синхронизируете доступ к переменной (или используете AtomicReference, или volatile), возможно, что один поток может обновить имя, но другие потоки продолжают видеть старое значение. Таким образом, вы можете наблюдать эффекты вмешательства потока.
  • Пользователи этого класса могут обнулить поле INSTANCE, что означает, что любой, кто пытается получить доступ к значению поля в любое время, должен сначала проверить, является ли он нулевым. Это легко исправить, сделав поле final; но лучше просто сделать класс в одноэлементное перечисление.
1

Не совсем.

Неизменяемый класс также не означает, что вы не можете создавать больше объектов одного и того же неизменяемого класса. Для singleton обычно один экземпляр для JVM необходим для того, чтобы он назывался singleton.

Неизменяемый означает, что присвоенное значение не может быть изменено, поэтому обычно у вас не будет методов настройки в неизменяемом, но такого требования нет для синглтона. Но синглтон больше с точки зрения памяти, только один экземпляр будет жить. Вы не можете изменить экземпляр, но вы можете использовать синглтон для хранения любого значения, которое вы хотите, и вы можете изменить его в любой момент времени.

например. мы использовали класс singleton как локатор сервисов. Мы могли бы изменить услуги в любой момент времени, исходя из нашей потребности. То же самое, я могу создать 2 объекта неизменяемого класса с одинаковыми переменными, но с разными значениями.

Надеюсь, это поможет.

0

Прежде всего, пример синглтона, который вы указали, на самом деле не является синглом.

Модели singleton заставляют вас использовать только один объект для каждого класса во всем приложении. В вашем примере можно создать как можно больше объектов.

Принудительное создание одного объекта может быть достигнуто с помощью частного конструктора и предоставления «INSTANCE» каждый раз, когда запрос объекта приходит к этому классу с использованием некоторого статического метода: getInstance().

Неизменяемость имеет разную цель. В основном это связано с безопасностью объекта, например. Когда объект создается, вы не можете изменить его состояние.

Очевидно, что вы должны обеспечить состояние при создании этого объекта. Я имею в виду, что вам нужен параметрический конструктор, чтобы назначить постоянное состояние этому объекту.

Так Основное отличие заключается в:

Singleton: Вы не можете иметь больше одного объекта в любом случае (в отличие от неизменного объекта, вы не ограничены в изменение состояния, но в основном вы не предполагаете, чтобы изменить состояние Синглтона объекта.)

Неизменность: вы не можете изменить состояние объекта в любом случае, но вы можете иметь столько объект, как кучного PERMITS ;-)

+0

Я сделал студента-конструктора частного в моей java implimentation –

+0

О, отлично! Тогда проигнорируйте первые три строки моего ответа. Упование вы находите 7-3 = 4 линии полезно ;-) – vvtx

0

вы студент класса, но это все неизменны. Открытый setName() класса Student предотвращает неизменность состояний. Неизменяемый объект не дает возможности изменить свое состояние.

Если ваш объект неизменен, ваш экземпляр учащегося Student.INSTANCE не мог изменить свое название. Но вы меняете свое имя несколько раз. И ваш systemOut в конце подтверждает изменчивость: последнее имя «установлено» отображается методом toString().

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); 

Кроме того, если непреложный объект хочет, чтобы обеспечить операции, связанные с государственными изменениями, он не будет применяться к примеру сам, она возвращает, а новый экземпляр объекта с этим новым государством.

Смежные вопросы