2015-01-25 1 views
1

필자는 불변의 클래스가 final이어야한다고 항상 들었다. 하지만 불변의 최종 클래스 개체를 가질 수 있는지 궁금 해서요. 이 링크 (Why would one declare an immutable class final in Java?)는 변경 불가능한 클래스 메서드가 final이며 재정의 할 수없는 경우를 나타냅니다. 그리고 클래스의 모든 멤버가 final 인 경우 해당 클래스의 객체는 변경할 수 있습니다 (변경 가능한 객체를 참조하지 않는 한). 제발 틀렸다고 말하면 제게 말해줘.final이 아닌 불변의 클래스

답변

5

불변의 클래스 (final이 아님을 의미)를 확장 할 수 있다면, 하위 클래스에 변경할 수있는 속성을 추가 할 수있다. 그러므로 기본 클래스는 가변적 인 하위 클래스를 가질 수 있기 때문에 기본 클래스도 변경할 수 있습니다.

+0

좋습니다.이 경우에는 변경 불가능한 부모 참조가있는 하위 클래스 객체를 만들 수 있습니다. 이제 참조가 가리키는 것은 실제로 변경 될 수 있습니다. 내가 맞습니까? –

+0

@jayendrabhatt 네, 맞습니다. – Eran

4

불변 클래스가 반드시 final 일 필요는 없지만 서브 클래스 화되지 못하도록해야합니다. 공개 또는 보호 된 생성자가 없기 때문입니다.

예를 들어 Guava의 ImmutableList 클래스는 final이 아니지만 Javadoc에 설명 된대로 변경할 수 없습니다.

-1

불변 클래스를 생성하려면 클래스를 final로 표시 할 필요는 없습니다.

Java 클래스 자체에서 이러한 예제 중 하나를 취하게하겠습니다. "BigInteger"클래스는 불변이지만 최종이 아닙니다.

실제로 Immutability는 개체가 어떤 개체를 만든 다음 수정할 수 없는지에 대한 개념입니다.

JVM 관점에서 모든 스레드가 객체의 동일한 사본을 공유해야하며 모든 스레드가 스레드에 액세스하기 전에 완전히 구성되어야하며 객체의 상태가 생성 후에 변경되지 않는다고 생각해 봅시다. .

- :

불변성이이 생성되면 요 오브젝트의 상태를 변경할 수있는 방법이 없으며, 이러한 클래스는 불변 인식 컴파일러하게 세 손가락 규칙에 의해 달성되고, 그들은 다음과 같은 의미 모든 비공개 필드가 최종적이어야 함 개체 필드를 직접 또는 간접적으로 변경할 수있는 메서드가 클래스에 없는지 확인하십시오. 클래스에 정의 된 개체 참조를 클래스 외부에서 수정할 수 없습니다. 자세한 내용 아래 URL을 참조하십시오.

http://javaunturnedtopics.blogspot.in/2016/07/can-we-create-immutable-class-without.html

+0

자신의 블로그를 과도하게 홍보하는 것은 금지되어 있습니다. [도움말 센터] (http://stackoverflow.com/help/behavior)를 참조하십시오. –