Я не знаю ни одного правила, которое говорит, что какой-либо конкретный атрибут должен быть частным в классе, Java предлагает другие модификаторы, как они не защищены и общественности, а не модификатор, который подразумевает доступность пакетов. Все они есть, чтобы вы могли применять различные уровни encapsulation, которые вы можете считать подходящими в соответствии с вашим дизайном.
В части инициализации поля вопроса, я думаю, что когда поле объявляется в классе, если поле имеет какой-либо ссылочный тип it is by default initialized to null, поэтому вам не нужно его инициализировать, если вы не считаете это необходимым или если поле объявляется как final, что означает, что вы хотите инициализировать его значением по умолчанию.
О геттере и сеттерной части вопроса, я считаю, что это всего лишь способ обеспечить инкапсуляцию. Аллан Снайдер в своей статье Encapsulation and Inheritance in Object-Oriented Programming Languages писал:
Чтобы максимизировать преимущество инкапсуляции, следует свести к минимуму воздействия деталей реализации внешних интерфейсов [...] Для Например, одна характеристики объектно-ориентированного языка, является ли он позволяет дизайнеру определять класс таким образом, чтобы его переменные экземпляра можно было переименовать, не затрагивая клиентов.
Также большая статья Леонида Михайлов и Эмиль Sekerinski caled A Study of the Fragile Base Class Problem могут продемонстрировать некоторые хорошие идеи о том, почему все эти уровни инкапсулирования и косвенностью подходят, чтобы избежать некоторых классических проблем, связанных с наследованием.
«Нет прямой доступ к государственному базовому классу» требованию: расширение класс должен без доступа состояния своего базового класса непосредственно, но только посредством вызова методов базового класса.
В их статье приводятся очень веские причины, по которым что-то вроде методов getter и setter может быть хорошей идеей, чтобы избежать хрупкости расширения класса.
Обратите внимание, что переменные 'String' инициализируются на' null', поэтому 'String s =" "' сильно отличается от 'String s'. –
«Должны иметь геттеры и сеттеры». Вообще говоря, члены класса, примитивы или нет, не должны иметь сеттеров, если для этого нет веских оснований. – assylias