문제

불변의 유형 객체 (String, Integer, ..)를 메소드로 전달하면 C ++ 상수 포인터의 문자를 달성 할 수 있습니다. 그러나 변이 가능한 물체에서 어떻게 그러한 행동을 시행 할 수 있습니까?

public void someMethod(someType someObject){
 /*
  * code that modifies the someObject's state
  * 
  */
}

내가 원하는 것은 Somemethod가 Somebject의 상태를 수정하는 것을 방지하는 것입니다. 이게 가능해?

도움이 되었습니까?

해결책

아니요, 이것이 가능하지 않다고 생각합니다. 정상적인 접근 방식은 상태를 변경하는 모든 방법이 지원되지 않은 상태에서 발생하는 모든 방법에 대한 어댑터를 만드는 것입니다. 예를 들어 java.util.collections.unmodifiable*-핀에 의해 사용됩니다.

이것에 대한 몇 가지 접근법이 있습니다.

  • 당신은 somecondype를 인터페이스로 만들 수 있고, 읽을 필요가있을 때, 모든 읽기 방법을 원래 객체에 위임하고 모든 쓰기 방법을 구현하여 예외를 던지는 래퍼를 만듭니다.
  • 또는 모든 쓰기 방법을 재정의하는 Sombertype의 서브 클래스를 만들 수 있습니다.

물론 이것은 컴파일 타임이 아닌 런타임 확인 만 제공 할 것입니다. 컴파일 타임을 원한다면 Somebolyte가 쓰기 방법이없는 인터페이스 (또는 슈퍼 클래스)가 될 수 있습니다.

다른 팁

일반적인 경우에는 불가능합니다. 매우 제한된 경우, 동일한 인터페이스를 제공하는 클래스에서 ondetype을 랩핑 할 수 있습니다 (예를 들어 Collections.unmodifiablelist () 참조).

그러나 "const 포인터를 통과하고 컴파일러를 사용하면 const 함수 만 호출 할 수 있습니다"와 동등한 것은 없습니다.

아니요, setxxx () (또는 유사한) 메소드를 통해 객체가 수정되는 것을 방지 할 수 없습니다. 그래도 클론이나 사본을 손으로 건드릴 수 있습니다.

아니요, 불가능합니다. 객체의 사본을 전달하거나 어떤 행동이 객체를 변경하고 호출하지 않도록하는지 아는 데 의존해야합니다. 컴파일러는 도움이되지 않습니다.

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