Tylko moje 2 centy na pytanie, dlaczego semantyka prywatnej widoczności w Javie jest na poziomie klasy, a nie na poziomie obiektu.
Powiedziałbym, że wygoda wydaje się tutaj kluczowa. W rzeczywistości prywatna widoczność na poziomie obiektu zmuszałaby do ujawnienia metod innym klasom (np. W tym samym pakiecie) w scenariuszu przedstawionym w PO.
Prawdę mówiąc, nie byłem w stanie ani wymyślić, ani znaleźć przykładu pokazującego, że widoczność na poziomie prywatnej klasy (jak oferowana przez Javę) stwarza jakiekolwiek problemy w porównaniu z widocznością na poziomie prywatnym obiektu.
To powiedziawszy, języki programowania z bardziej szczegółowym systemem polityk widoczności mogą zapewnić widoczność obiektów na poziomie obiektu i na poziomie klasy.
Na przykład Eiffel oferuje selektywny eksport: możesz wyeksportować dowolny obiekt klasowy do dowolnej wybranej klasy, od {NONE} (obiekt-prywatny) do {DOWOLNY} (odpowiednik publicznego, a także domyślnego), do {PERSON} (klasa prywatna, zobacz przykład OP), do określonych grup klas {PERSON, BANK}.
Warto również zauważyć, że w Eiffel nie trzeba ustawiać atrybutu jako prywatnego i pisać metody pobierającej, aby uniemożliwić innym klasom przypisywanie do niego. Atrybuty publiczne w Eiffel są domyślnie dostępne w trybie tylko do odczytu, więc nie potrzebujesz funkcji pobierającej tylko do zwrócenia ich wartości.
Oczywiście nadal potrzebujesz ustawiacza, aby ustawić atrybut, ale możesz go ukryć, definiując go jako „przypisującego” dla tego atrybutu. Pozwala to, jeśli chcesz, na użycie wygodniejszego operatora przypisania zamiast wywołania ustawiającego.