2014-12-31 4 views
0

나는 불변량에 대해 읽고 있는데, 나는 그것을 완전히 이해하고 있는지 확신 할 수 없다. Wikipedia에서불변 식은 상태 비 저장 오브젝트에 적용됩니까?

클래스 불변 객체에 저장된 상태을 제한.

따라서 올바른 경우 불변 조건은 제약이 없으므로 상태 비 저장 개체에는 적용되지 않습니다. 그 맞습니까? 내가 잘못? 사과와 오렌지를 비교합니까? 객체의 (mybankAccount) 메소드의 호출 사이

myBankAccount.Balance >= 0 :

+2

스테이트리스 오브젝트는 컴파일시의 시정 수 필드 만 가지므로 - 아니요, 어떤 인 터리 언트도있을 수 없습니다. 그러나 메소드에는 불변성이있을 수 있습니다. –

+1

직관적으로, 아니요. 상태가 없으면 클래스에 불변량을 적용 할 수 없습니다. 조건을 수행 할 국가가 없을 때 어떤 불변 조건을 만들 수 있습니까? –

답변

0

불변 같은 것을 할 것이다. Balance 변수는 myBankAccount 개체의 구성원입니다.

상태가없는 개체, 즉 연결된 데이터 멤버가없는 개체가있는 경우 실제로 불변성을 정의 할 수 없습니다 (우리는 무엇을 정의할까요?).

0

상태가없는 개체에는 상태가 없습니다. 이 해당 번호/카운트가 변경되지 않습니다 의미와 스레드의 'N'번호로 참조되는 관계없이 일관성을 유지합니다

public class MyClass { 
    public static final int number = 1; 
    private final int count = 1; 
} 

: 모든 필드를하거나 아래와 같이 일정 필드가 나던 유틸리티 클래스 말의 예를 가지고 . 내가 private 필드 말과 함께 수업을하고 세터/게터 액세스 말되는 경우 다음이 모양을하는 동안

는 :

public class MyInvariantClass { 
    private int number; 

    public int getNumber() { 
     return number; 
    } 
    public void incrNumber() { 
     this.number++; 
    } 
    public void setNumber() { 
     this.number = number; 
    } 
} 

이 클래스 MyInvariantClass, 번호 필드와 상태를 가지고있다. 이 객체가 여러 스레드로 전달된다고 생각하십시오. 일부는 그것을 증가시킬 수도 있고, 어떤 것은 그것을 설정할 수도 있습니다. 우리가 사용하고있는 숫자가 결코 int 범위를 벗어나지 않으며 기본값이 음수가되도록 보장합니까? 그래서 여기서 우리는 오버플로가 발생할 때 정수의 불변성을 유지하지 못합니다.

+0

왜 멀티 스레딩에 집중합니까? 나는 불변량이 특별히 다중 쓰레드로 중요하다고 생각하지 않습니까? – user4408343

+0

아니요, 맞습니다. 하지만 당신이 incrNumber 메소드를 호출 할 때조차도 말하기 만하면 오버플로되어 음수로 되돌아가는 것을 보장하지 않을 것입니다. – SMA

0

상태 비 저장 클래스에는 인스턴스 구성원이 없으므로 유효한 상태를 유지할 수 없습니다. 위키

: 컴퓨터 과학

, 불변하거나 그것의 일부 동안 프로그램의 실행시에 해당 될시 를 신뢰할 수있는 상태이다.

자바에서 이러한 조건 (불변 조건)은 몇 가지 방법으로 코드에 프로그래밍 할 수 있습니다.

  • 던지는 예외
  • 사용 뮤 테이터 방법 예를 들어

  • , 클래스 시대 걸릴 사용하여 최종 키워드
  • 를 사용

    1. 어썰트 :

      public class Age { 
          private final int age; 
      
          public Age(int age) { 
           // Use exceptions... 
           if (age < 1) { 
            throw new IllegalArgumentException("Age cannot be less than 1"); 
           } 
      
           // Or use assertions... 
           assert age > 0; 
           this.age = age; 
          } 
      
          // A method can be a invariant as well, because it makes sure 
          // member variables cannot be set to an invalid state. 
          public Age changeAge(int age) { 
           assert age > 1; 
           return new Age(age); 
          } 
      } 
      
      여기에 몇 가지

      그래서 최종 키워드는 컴파일 타임입니다. 변수가 재 할당되지 않았기 때문에 불변합니다. 생성자의 예외와 어설 션은 런타임을 고정시키고 나이를 제한하고 나이가 0보다 큰지 확인하기 때문에 런타임 불변 식입니다. public 메서드는 인수가 유효하지 않은 것으로 주장하기 때문에 불변합니다.

      일부 언어에는 invariants가 내장되어 있다는 개념이 있습니다. 링크 된 위키피디아 페이지에는 D와 Eiffel이 예제로 나와 있습니다. 이것이 의미하는 것은 예외를 발생시키고, 조건을 주장하고 점검하는 대신 한 곳에서 제약 조건 (invariant)을 정의 할 수 있으며 언어는 인스턴스 변수가 설정 한 제약 조건 내에 남아 있도록 지원합니다. 자바에서는 '수동으로'해야합니다.

  • 관련 문제