Деякі мови та фреймворки виконання (наприклад, Java, .NET) припускають, що кожному, хто компілює код для певного класу, можна довіряти, що він не використовує приватних членів будь-якого екземпляра цього класу способами, які шкодять його правильності операція. Інші мови та рамки є більш обмежуючими в цьому плані і не дозволяють отримати доступ до приватних членів екземпляра, за винятком коду, що працює на цьому екземплярі . Обидві конструкції мають переваги та недоліки.
Найбільшою перевагою дозволу будь-якого коду в класі отримати доступ до приватних членів будь-якого примірника є те, що є випадки, коли цей рівень доступу є відповідним, а private
робота таким чином усуває необхідність мати інший класифікатор доступу для цієї мети або в іншому випадку примушуйте код розкривати членів ширше, ніж це було б інакше ідеально.
Перевагою заборони такого доступу (як це було у звичайній об'єктній моделі Microsoft (COM)) є те, що він дозволяє зовнішньому коду трактувати класи як інтерфейси. Якщо клас ImmutableMatrix
містить приватне або захищене double[][]
резервне поле і якщо код у класі вивчає резервний масив інших екземплярів, то неможливо визначити клас ZeroMatrix
, IdentityMatrix
який не підтримується масивом (наприклад , ), який зовнішній код може використовувати як an Immutable2dMatrix
, без цього класу не потрібно включати резервне поле. Якщо нічого в межах не Immutable2dMatrix
використовується приватних членів будь-якого іншого, крім іншого this
, можна було б перейменувати клас у ImmutableArrayBackedMatrix
та визначити новий абстрактний ImmutableMatrix
клас, який міг би мати ImmutableArrayBackedMatrix
як і вищезазначені класи, не підтримувані масивом, як підтипи.
Зауважте, що таке рефакторинг не завадило б за допомогою мови "дозволити" ImmutableMatrix
вивчити резервний масив для інших this
випадків, за винятком випадків, якщо мова не скористалася цією здатністю і фактично не вивчила зовнішні інстанції. Основним ефектом обмеження такого використання мови є те, що він змусить компілятор негайно під час будь-якої спроби написати код, який не піддався б такому рефакторингу.
equals
це перевірка приватних полів іншого екземпляра. (Публікуємо як коментар, оскільки це коротко, і нічого про OOP-ності такого підходу)