Лише мої 2 центи на питання, чому семантика приватної видимості в Java є рівнем класу, а не об’єктом.
Я б сказав, що тут, здається, зручність . Насправді, приватна видимість на рівні об'єкта змусила б піддавати методи іншим класам (наприклад, у тому самому пакеті) у сценарії, проілюстрованому OP.
По правді кажучи, я не зміг ні придумати, ні знайти приклад, що показує, що видимість на рівні класу-приватності (як, наприклад, пропонується Java) створює будь-які проблеми, якщо порівнювати з видимістю на рівні об'єкт-приват.
Тим не менш, мови програмування з більш докладною системою політик видимості можуть забезпечити видимість об'єкта як на рівні об'єкта, так і на рівні класу.
Наприклад, Ейфель пропонує вибірковий експорт: ви можете експортувати будь-яку функцію класу до будь-якого класу на ваш вибір, від {NONE} (об'єктно-приватний) до {ANY} (еквівалент загальнодоступного, а також за замовчуванням), до {PERSON} (клас-приват, див. приклад OP), для певних груп класів {PERSON, BANK}.
Цікаво також зауважити, що в Ейфелі не потрібно робити атрибут приватним і писати геттер, щоб запобігти присвоєнню йому інших класів. Загальнодоступні атрибути в Ейфелі за замовчуванням доступні в режимі лише для читання, тому вам не потрібен геттер, щоб повернути їх значення.
Звичайно, вам все ще потрібен сеттер, щоб встановити атрибут, але ви можете приховати його, визначивши його як "призначувач" для цього атрибута. Це дозволяє вам, якщо ви хочете, використовувати більш зручний оператор присвоєння замість виклику сетера.