주제를 검색했지만 위키피디아 외에는 유용한 문서 나 기사를 찾지 못했습니다.
아무도 그것이 의미하는 바를 간단한 말로 설명하거나 멋지고 이해하기 쉬운 문서를 참조 할 수 있습니까?
주제를 검색했지만 위키피디아 외에는 유용한 문서 나 기사를 찾지 못했습니다.
아무도 그것이 의미하는 바를 간단한 말로 설명하거나 멋지고 이해하기 쉬운 문서를 참조 할 수 있습니까?
답변:
Java와 관련하여 특별히 의미하는 것은 아닙니다.
클래스 불변은 다른 코드가 수행하는 작업에 관계없이 항상 클래스의 모든 인스턴스를 유지하는 속성입니다.
예를 들면
class X {
final Y y = new Y();
}
X는 y
속성이 있고 결코 존재하지 않으며 null
type 값을 갖는다 는 불변 클래스를 가지고 Y
있습니다.
class Counter {
private int x;
public int count() { return x++; }
}
두 가지 중요한 불변성을 유지하지 못함
count
때문에 가능한 언더 플로우의 음의 값을 반환하지 않습니다.count
은 엄격하게 단조롭게 증가하고 있습니다.수정 된 클래스는이 두 가지 불변성을 유지합니다.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
그러나 예외가 발생하거나 교착 상태가 된 스레드가 카운터의 모니터를 소유하는 경우 차단 될 수 있기 때문에 호출이 count
항상 정상적으로 성공 (TCB 위반 † 없음 ) 하는 불변성을 보존하지 못합니다 count
.
클래스가있는 각 언어를 사용하면 일부 클래스 불변성을 쉽게 유지할 수 있지만 다른 언어는 유지하지 않습니다. Java도 예외는 아닙니다.
private
필드 를 보호 할 수 있으므로 개인 데이터에 의존하는 불변성은 유지 관리가 쉽습니다.null
값이 여러 가지 방법으로 몰래 빠져 나갈 수 있도록 허용 하므로 "실제 값이 있음"불변성을 유지하기가 어렵습니다.†- 외부 성 또는 TCB 위반 은 시스템 설계자가 낙관적으로 발생하지 않을 것이라고 가정하는 이벤트입니다.
일반적으로 우리는 기본 하드웨어가 그 위에 구축 된 고급 언어의 속성에 대해 이야기 할 때 광고 된대로 작동한다고 믿고 불변성이 보유하고있는 우리의 주장은 다음 가능성을 고려하지 않습니다.
setAccessible
하여 private
조회 테이블 을 수정 하지 않습니다 .일부 시스템의 경우 TCB는 시스템의 일부만 포함 할 수 있으므로
하지만 우리는
시스템의 수준이 높을수록 일반적으로 TCB가 더 커지지 만 TCB에서 얻을 수있는 불안정한 항목이 많을수록 불변성이 유지 될 가능성이 높아지고 장기적으로 시스템의 안정성이 높아집니다.
count
동일한 값을 두 번 반환하지 않는다"는 것이 실제로 클래스 불변으로 간주됩니까?
Invariant는 변경 사항이나 사용 / 변형에 관계없이 조건을 고수해야하는 것을 의미합니다. 즉, 클래스의 속성은 public 메서드를 사용하여 변형을 거친 후에도 항상 어떤 조건을 충족하거나 만족시킨다. 따라서이 클래스의 클라이언트 또는 사용자는 클래스 및 해당 속성에 대해 보장됩니다.
예를 들면
인스턴스 클래스에 대해 사실이어야하는 사실입니다. 예를 들어 클래스에 X 속성이 있고 불변이 X는 0보다 커야합니다. 내 지식으로는 속성을 비공개로 설정하고 getter와 setter가 불변 속성을 적용하는지 확인해야합니다.
리플렉션과 인터셉터를 사용하여 속성을 확인할 수있는 주석이 있습니다. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html