Niektóre języki i środowiska wykonawcze (np. Java, .NET) przyjmują założenie, że każdemu, kto kompiluje kod dla określonej klasy, można ufać, że nie użyje żadnych prywatnych członków żadnej instancji tej klasy w sposób, który byłby szkodliwy dla jego poprawności operacja. Inne języki i frameworki są pod tym względem bardziej restrykcyjne i nie pozwalają na dostęp do prywatnych członków instancji, z wyjątkiem kodu działającego w tej instancji . Oba projekty mają zalety i wady.
Największą zaletą zezwalania każdemu kodowi w klasie na dostęp do prywatnych członków dowolnej instancji jest to, że istnieją przypadki, w których ten poziom dostępu jest odpowiedni, a private
praca w ten sposób eliminuje potrzebę posiadania innego kwalifikatora dostępu do tego celu lub inaczej zmusi kod do ujawnienia członków w szerszym zakresie niż byłoby to idealne.
Zaletą uniemożliwienia takiego dostępu (jak miało to miejsce w przypadku modelu Microsoft Common Object Model (COM)) jest to, że pozwala on kodowi zewnętrznemu traktować klasy jako interfejsy. Jeśli grupa ImmutableMatrix
zawiera prywatne lub chronione double[][]
pole oporowe i jeśli kod w klasie bada tablicę podkładową innych przypadkach, to nie jest możliwe określenie klasy nie tablicy oparciem (na przykład ZeroMatrix
, IdentityMatrix
), który może wykorzystać kod zewnętrzny w i Immutable2dMatrix
bez konieczności uwzględnienia przez tę klasę pola zaplecza. Jeśli nic wewnątrz nie Immutable2dMatrix
korzysta z prywatnych członków żadnej instancji innej niż this
, wówczas można by zmienić nazwę klasy na ImmutableArrayBackedMatrix
i zdefiniować nową ImmutableMatrix
klasę abstrakcyjną, która mogłaby mieć, ImmutableArrayBackedMatrix
podobnie jak wyżej wymienione klasy nieobsługiwane przez tablice, jako podtypy.
Zauważ, że takiemu refaktoryzacji nie można zapobiec, jeśli język „zezwoli” ImmutableMatrix
na sprawdzenie tablicy this
pomocniczej dla instancji innych niż , chyba że język skorzystałby z tej możliwości i faktycznie zbadał instancje zewnętrzne. Podstawowym efektem ograniczenia użycia takiego języka jest to, że kompilator natychmiast skrzęczy przy każdej próbie napisania kodu, który nie byłby podatny na takie refaktoryzowanie.
equals
że trzeba sprawdzić prywatne pola innej instancji. (Publikowanie jako komentarz, ponieważ jest krótki, i nic o OOP-ności tego podejścia)