Не понял почему нарушил???
Думаю я не понял правильно что вы имели ввиду под "целостен".
В таком случае придется передовать в конструктор только примитивные данные (или иммутабельные объекты) чтобы не было возможно их менять снаружи, а в конструкторе создавать position для персонажа.
а в конструкторе создавать position для персонажа. Именно. При создании объекта мы передаем ему в конструктор начальную позицию, после чего мутируем через метод сеттер, или to или move или еще как называем метод перемещения.
Может я не верно понимаю о чем вы говорите, но для этого и придуманы getter и setter. Один отдает значение, другой его устанавливает. Почему у нас не должно быть getter'a и setter'a? Как вы будете менять позицию через getter? Если то как вы написали выше, то это очень жесткое нарушение инкапсуляции. Вообще говоря геттеры и сеттеры сами по себе её нарушают.
Если объект иммутабелен, то изменить его никто вообще не сможет, а не "нестрашно". Иначе он не иммутабелен. И вообще, как вы будете менять позицию персонажа, если объект позиции иммутабелен? Создавая на каждое перемещение копию объекта, но зачем нам это в данном случае я не совсем понимаю.
Иммутабельность просто необходима когда у нас есть действительно разделяемые данные между разными сущностями, в нашем случае с персонажем, позиция конкретного персонажа "Darth Vader" это его и только его состояние. Посмотрите на себя как на объект. Ваше положение в пространстве координат вы делите со мной, с Васей, с Машей, с Петей? Нет. Это только ваше состояние, которое принадлежит вам как объекту. Оно в вас инкапсулировано. Почему Дарт Вейдер должен получать своё состояние о нахождении в пространстве из внешнего объекта?