Довольно субъективно.
Но, учитывая мои весьма субъективные взгляды на то, что кажется хорошей практикой ...
Иногда это считается «благоразумным», когда вы просто используете класс в качестве «объекта передачи данных», иногда известного как «объект значения». Сама их природа заключается в том, что они стройные и не содержат поведения и только состояния. Если вы не знакомы с этим шаблоном, он просто группирует объекты / примитивы в контейнер, и это его единственная функция.
За исключением этого, как представляется, считается общепринятой практикой, когда публичные поля не используются по указанным вами причинам. Другая причина - контроль доступа . Иногда потребители должны иметь возможность только прочитать значение, а его можно установить только локально. Использование геттеров / сеттеров позволяет вам делать такие вещи. (Некоторые языки также позволяют вам делать это через постоянные / доступные только для чтения поля, которые можно установить один раз при инициализации)
Кажется, что Фаулер помещает функциональность сериализации в сам DTO, но одна школа мысли не должна существовать в полях объекта DTO / Value.
http://martinfowler.com/eaaCatalog/dataTransferObject.html