일부 언어 및 런타임 프레임 워크 (예 : Java, .NET)는 특정 클래스에 대한 코드를 컴파일하는 사람은 해당 클래스의 인스턴스의 개인 멤버를 올바른 방식으로 해칠 수있는 방식으로 사용하지 않을 것을 신뢰할 수 있다고 가정합니다. 조작. 다른 언어와 프레임 워크는 점에서 더 제한, 실행 코드에 의한 경우를 제외 인스턴스의 private 멤버에 대한 액세스를 허용하지 않는 인스턴스에 . 두 디자인 모두 장단점이 있습니다.
클래스 내의 모든 코드가 인스턴스의 비공개 멤버에 액세스 할 수있게하는 가장 큰 장점은 해당 액세스 수준이 적절한 경우가 있으며, private
그러한 방식으로 작업을 수행하면 해당 용도로 사용할 수있는 다른 액세스 한정자가 없어도됩니다. 그렇지 않으면 코드가 다른 것보다 더 광범위하게 멤버를 노출하도록합니다.
Microsoft COM (Common Object Model)에서와 같이 이러한 액세스를 허용하지 않으면 외부 코드에서 클래스를 인터페이스로 처리 할 수 있다는 이점이 있습니다. 클래스가 있으면 ImmutableMatrix
전용 또는 보호 포함 double[][]
배면 필드 클래스 내의 코드는 다른 인스턴스 백킹 어레이를 검사하는 경우, 그리고, 비 - 배열 백업 클래스를 정의하는 것이 가능하지 않을 것 (예를 들어 ZeroMatrix
, IdentityMatrix
) 외부 코드로 사용할 수있는 Immutable2dMatrix
배킹 필드 등을 갖는 클래스없이. 내부 Immutable2dMatrix
에서을 제외한 다른 인스턴스의 전용 멤버를 사용 하지 않는 경우 this
클래스 이름을로 변경 하고 앞에서 언급 한 비 배열 클래스뿐만 아니라 하위 유형으로 가질 수 ImmutableArrayBackedMatrix
있는 새로운 추상 ImmutableMatrix
클래스를 정의 할 수 있습니다 ImmutableArrayBackedMatrix
.
언어가 해당 기능을 활용하지 않고 실제로 외부 인스턴스를 검사하지 않는 한, 언어가 ImmutableMatrix
이외의 인스턴스에 대해 배킹 배열을 검사 할 수 있도록 "허용"하도록하여 리팩토링을 방지 할 수는 없습니다 this
. 언어가 그러한 사용을 제한하는 주요 효과는 리팩토링에 적합하지 않은 코드를 작성하려고 할 때 컴파일러가 즉시 스 쿼크하게 만든다는 것입니다.
equals
다른 인스턴스의 프라이빗 필드를 확인해야한다는 것입니다 . (이것은 짧고,이 접근법의 OOP-ness에 대해서는 아무것도 언급하지 않음)