Нет никакого способа сделать это в Java.
Два ваших варианта (один из которых вы упомянули) - использование открытых методов получения и закрытие поля или полная документация в классе.
Накладные расходы на методы получения очень малы (если вообще).Если вы делаете это большое количество раз, вы можете захотеть кэшировать извлеченное значение вместо вызова метода get.
EDIT:
Один из способов сделать это, хотя он имеетдаже больше, чем получатель, определяет общедоступный внутренний класс (назовем его innerC
) с помощью конструктора, который доступен только вашему классу C
, и делает ваши поля открытыми.Таким образом, вы не можете создавать innerC
экземпляры вне вашего класса, поэтому изменение ваших полей извне невозможно, но вы можете изменить их изнутри.Однако вы можете прочитать их снаружи.