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 个不可变类的对象,但持有不同的值。
希望这可以帮助。