2016-07-27 3 views
1

내가 읽은 바는 이터티 (Immutability) 란 할당 된 값이 상수로 남아 있음을 의미합니다. 즉, 일단 할당되면 코드 전체에 동일한 값으로 반영됩니다.불변과 싱글 톤이 같은 목적을 해결합니까?

주로 불변성은 다중 스레드 환경에서 기능 프로그래밍 패러다임에서 사용됩니다.

하지만.

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 

인, 자바로 작성 싱글의를 검색, 싱글 톤 패턴은 같은 목적을 해결합니까 저는 싱글 톤을 자바 스크립트로 작성했습니다.

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]ahul:~/myPractise/JavaScript-DesignPatterns$ node singleton.js 
Student is Sarvik 
[email protected]:~/myPractise/JavaScript-DesignPatterns$ 

를 다음과 같이 출력된다 (즉, javaScript 및 java) 싱글 톤 패턴 의 구현을 통해 객체의 상태가 변경되지 않는다는 것을 알 수 있습니다.

개체의 값을 다시 설정하더라도 출력은 최신 재설정 값을 제공합니다.

그래서 싱글 톤 패턴을 사용하여 "Student"객체 코드에서 불변성을 얻었습니까?

+1

http : // stackoverflow.com/questions/13784244/are-all-immutable-objects-singleton-instances – Unknown

+1

단일성과 불변성은 직교합니다. 싱글 톤은 변경 가능하거나 변경 불가능할 수 있습니다. non-singleton은 변경 가능하거나 변경 불가능할 수 있습니다. 그러나 싱글 톤 *은 여러 스레드에서 사용되는 경우 스레드 안전성이 있어야합니다. 변경 불가능한 객체는 기본적으로 스레드로부터 안전합니다. –

+1

'학생'클래스는 명확하게 변경할 수 없습니다 : 설정 메소드가 있습니다. –

답변

1

아니요 : 단일성과 불변성이 직교합니다. 싱글 톤은 변경 가능하거나 변경 불가능할 수 있습니다. non-singleton은 변경 가능하거나 변경 불가능할 수 있습니다.

그러나 단일 스레드는 여러 스레드에서 사용되는 경우 스레드로부터 안전해야합니다. 변경 불가능한 객체는 기본적으로 스레드로부터 안전합니다.


귀하의 Student 클래스는 약 싱글하지만, 불변되지 않습니다 : 당신은 멤버 변수 를 변이합니다 세터 메소드가있는 클래스는 불변 수 없습니다.

그러나, 당신의 Student 클래스는 스레드 안전하지 않다, 또는 안전 :

  • 당신은 name의 가치를 변이 할 수 있지만, 다른 스레드에서 name 필드의 가시성에 대한 보장은 없습니다 : 변수 (또는 AtomicReference 또는 volatile)에 대한 액세스를 동기화하지 않기 때문에 하나의 스레드가 이름을 업데이트 할 수 있지만 다른 스레드는 이전 값을 계속 볼 수 있습니다. 따라서 스레드 간섭 효과를 관찰 할 수 있습니다.
  • 클래스의 사용자가 INSTANCE 필드를 null로 지정할 수 있습니다. 즉, 언제든지 필드 값에 액세스하려고 시도하는 사람은 먼저 null인지 확인해야합니다. 이 필드를 수정하면 쉽게 수정할 수 있습니다 final; 클래스를 단일 요소 열거 형으로 만드는 것이 더 좋습니다.
1

아니요.

변경할 수없는 클래스는 동일한 불변 클래스의 개체를 더 이상 만들 수 없다는 것을 의미하지 않습니다. 싱글 톤의 경우, 일반적으로 JVM 당 하나의 인스턴스가 싱글 톤이라고해야합니다.

변경할 수 없다는 것은 변경할 수 없다는 것을 의미합니다. 따라서 일반적으로 변경할 수없는 메소드에 setter 메소드가 없지만 싱글 톤에 대한 요구 사항은 없습니다. 그러나 싱글 톤은 메모리 관점에서 볼 때 더 많으며, 단 하나의 인스턴스 만이 살아납니다. 인스턴스는 변경할 수 없지만 싱글 톤을 사용하여 원하는 모든 값을 유지할 수 있으며 어느 시점에서든 변경할 수 있습니다.

우리는 싱글 톤 클래스를 서비스 위치 지정자로 사용했다. 우리는 필요에 따라 주어진 시점에 서비스를 변경할 수 있습니다. 같은 일로, 변수가 같지만 다른 값을 가진 불변 클래스의 객체 2 개를 만들 수 있습니다.

희망이 도움이됩니다.

0

우선, 당신이 준 싱글 톤 예제는 실제로 싱글 톤이 아닙니다.

싱글 톤 패턴을 사용하면 응용 프로그램 전체에서 클래스 당 하나의 개체 만 사용해야합니다. 예를 들어, 가능한 한 많은 오브젝트를 작성할 수 있습니다.

private 생성자를 사용하여 강제로 단일 인스턴스 생성을 수행하고 getInstance()와 같은 정적 메서드를 사용하여 객체에 대한 요청이 해당 클래스에 올 때마다 'INSTANCE'를 제공 할 수 있습니다.

불변의 목적은 다른 목적입니다. 객체의 보안과 관련이 있습니다 (예 : 일단 객체가 생성되면 상태를 변경할 수 없습니다.

분명히 그 개체를 만드는 동안 상태를 제공해야합니다. 그 개체에 영구적 인 상태를 할당하려면 매개 변수 생성자가 필요합니다.

그래서 기본적인 차이는 다음과 같습니다

싱글 : 당신은 어떤 경우에 둘 이상의 개체를 가질 수 없습니다 (불변 객체는 달리, 당신은 상태 변경에 제한되지 않고 대부분이 단일 객체의 상태를 변경하는 생각되지 않습니다.)

불변성 : 당신은 어떤 경우에 개체의 상태를 변경할 수는 없지만 힙 허가 ;-)

+0

나는 내 java 구현에서 학생 생성자를 비공개로 만들었습니다. –

+0

Ohh great! 내 대답의 처음 세 줄을 무시하십시오. 희망 당신은 7-3 = 4 라인 도움이 ;-) 찾을 수 있습니다. – vvtx

0

당신의 학생 클래스는 모든하지만 불변이기 때문에 당신이 많은 객체를 가질 수 있습니다. Student 클래스의 public setName()은 상태가 변경되지 않도록합니다. 변경 불가능한 객체는 상태를 변경할 수있는 방법을 제공하지 않습니다.

개체가 불변 인 경우 학생 인스턴스 Student.INSTANCE은 이름을 변경할 수 없습니다. 하지만, 당신은 그 이름을 여러 번 바꿉니다. 마지막에 systemOut은 변경 가능성을 확인합니다. 성은 "setted"가 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); 

게다가, 그것은이 새로운 상태로 오히려 개체의 새 인스턴스를 반환, 자체 인스턴스에 적용되지 않습니다.

관련 문제