不变性和单例是否解决了相同的目的?

Rah*_*ran 4 javascript java singleton design-patterns immutability

我读到的是不变性意味着一旦分配的值保持不变,即一旦分配,它在代码中反映为相同的值。

大多数情况下,不变性用于多线程环境中的函数式编程范式。

但。

单例模式是否也解决了同样的目的,

请在下面找到用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);

  }

}
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是

Student is Sarvik
Run Code Online (Sandbox Code Playgroud)

同样,我也用 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());
Run Code Online (Sandbox Code Playgroud)

输出如下

rahul@rahul:~/myPractise/JavaScript-DesignPatterns$ node singleton.js 
Student is Sarvik
rahul@rahul:~/myPractise/JavaScript-DesignPatterns$ 
Run Code Online (Sandbox Code Playgroud)

在单例模式的两个(即 javaScript 和 java)实现中,您可以看到对象的状态保持不变,它不会改变。

即使我们重置对象的值,输出也会给出最新的重置值。

那么使用单例模式是否在我的对象“Student”代码中获得了不变性?

小智 6

并不真地。

不可变类也不意味着您不能创建同一个不可变类的更多对象。对于单例,通常每个 JVM 需要一个实例才能将其称为单例。

不可变意味着一旦分配的值无法更改,因此通常您不会在不可变中使用 setter 方法,但对于单例则没有这样的要求。但是单例更多的是从内存的角度来看,只有一个实例会存活。您不能更改 instance ,但您可以使用单例来保存您想要的任何值,并且您也可以在任何时间点更改它。

例如,我们使用单例类作为服务定位器。我们可以根据需要在任何给定时间点更改服务。对于同样的事情,我可以使用相同的变量创建 2 个不可变类的对象,但持有不同的值。

希望这可以帮助。