Il faut éviter de mettre de la logique autre que très simple dans les getter et les setter. Pour avoir trouvé des appels réseaux synchrones dans des getter ou des update de BDD dans des setter... c'est de la bonne surprise et on ne s'y attends absolument pas.
Le privé est présent pour le principe d'encapsulation, signifiant qu'une classe est seule responsable de ses composantes. Il permet de contrôler les accès et de s'assurer qu'une variable standard n'est pas utilisée en tant que globale, ou n'est pas en environnement multi-thread.
C'est une pratique qui n'a pas réellement d'effet visible et qui demande de la rigueur. Celle-ci permet d'éviter les dépendances et/ou liens "invisible" (ou tout du moins, de les limiter).
Par contre, il ne faut en aucun cas aller dans la génération systématique des accesseurs. Il y a des attributs qui ne sont pas fait pour être touché par d'autres classes, que ce soit en lecture ou écriture. Il faut ouvrir uniquement ce dont les autres classes ont besoin. Ni plus, ni moins.
Concernant le constructeur, son rôle est différent car lui est initialiseur, quand les accesseurs sont des accès en lecture ou écriture sur un objet déjà créé, donc initialisé. Il est normal que celui-ci modifie les attributs car ceux-ci peuvent, selon la logique du logiciel et son architecture, prendre des valeurs relatives à d'autres valeurs (paramétrage de logiciel, création d'un clone, calcul...).