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