문제

Java의 모든 최종 클래스는 변경할 수 없습니다.String과 Integer는 모두 최종 클래스이며 둘 다 변경할 수 없습니다.

도움이 되었습니까?

해결책

아니오 - 최종 클래스는 상속을받을 수 없다는 것을 의미합니다. 그것은 돌연변이와 관련이 없습니다. 다음 수업은 최종적이면서도 변이 가능합니다.

public final class FinalMutable {
  int value;
  public void setValue(int v) { value=v; }
  public int getValue() { return value; }
}

다른 팁

아니요, 최종적으로 클래스를 연장 할 수 없음을 의미합니다. 그것은 돌연변이에 대해 아무것도 말하지 않습니다. 예를 들어:

final class MutInt {
   public int modifyMe;
}

불변성에 대한 키워드는 없으며 디자인 패턴과 비슷합니다.

편집하다:
즉, 키워드가 없어 클래스를 불변으로 만듭니다. 수업을 불변으로 만들려면 내부를 최종적으로 또는 사적으로 만들어 내부를 보호해야합니다.

혼란스러운 점은 이것입니다. 최종 키워드는 클래스에서 사용될 때 다른 의미를 갖습니다. 전자는 "이 클래스는 확장 될 수 없다"는 것을 의미합니다. 두 번째는 "이 변수 (또는 참조)를 변경할 수 없음"을 의미합니다.

다른 응답에 더해 코드를 보면 java.lang.String 필드가 포함되어 있는 것을 볼 수 있습니다. hash, 이는 변하기 쉬운 실제로 계산되어 저장되는 경우는 다음과 같습니다. hashCode() 처음으로 호출됩니다.

하지만 수업은 아직 불변:그만큼 hash 필드는 직접 액세스하거나 클래스 외부에서 수정할 수 없습니다.

또한 JDK 내에서 일반적인 접근 방식은 객체 수정을 허용하지 않고 객체의 내부 상태를 노출하는 데 사용할 수 있는 불변 래퍼를 구현하는 것입니다.예를 들어

private final List<String> values;

public List<? get String> getValues() {
  return Collections.unmodifiableList(values);
}

앞서 다른 분들이 말씀하셨듯이 final 불변성 전략의 일부를 담당하지만 Java에서 클래스를 불변성으로 만들지는 않습니다.불변성을 얻으려면 일반 지침을 따라야 합니다.

  • 클래스를 재정의할 수 없는지 확인 - 클래스를 만듭니다. final, 또는 정적 팩토리를 사용하고 생성자를 비공개로 유지합니다.
  • 들판을 만들다 private 그리고 final
  • 후속 호출과 결합된 인수 없는 생성자를 사용하는 대신 호출자가 단일 단계로 객체를 완전히 생성하도록 강제합니다. setXXX 메소드(즉, Java Beans 규칙을 피함)
  • 어떤 방식으로든 객체의 상태를 변경할 수 있는 메소드를 제공하지 마세요. setXXX 메소드, 그러나 상태를 변경할 수 있는 모든 메소드
  • 클래스에 변경 가능한 객체 필드가 ​​있는 경우 클래스와 호출자 간에 전달될 때 방어적으로 복사해야 합니다.

서브 클래스의 재정의 방법으로 개인 필드에 액세스 할 수 없습니다 ... 하위 클래스 방법이 슈퍼 클래스의 개인 분야를 변경하는 방법은 없습니다 ... 그러면 불변의 클래스를 최종으로 만드는 것은 무엇입니까?

최종 키워드는 다른 클래스가 상속되는 것을 방지합니다. 최종 키워드는이를 불변으로 만들지 않지만 인스턴스 클래스 멤버를 개인화하고 최종적으로 최종적으로 만들고 세터를 사용하지 않는 것과 같은 조건이 있습니다.

최종 불변의 클래스는 돌연변이 할 수 없습니다. 여기에 아래는 비전자의 불변 계급이 돌연변이되는 것을 보여줍니다.

// a class not intended to be mutated 
public class GoodClass{

   private String name;

   public GoodClass() {
       this.name = "Good Class Neme";
   }

   public String getName() {
       return name;
   }
}

public class BadClass extends GoodClass {

   private String name;

   public String getName() {
       return name;
   }

   // mutating state
   public void setName(String name) {
       this.name = name;
   }
}



라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top