2013-05-14 2 views
20

В мои годы программирования я часто делал классы, которые просто группировали несколько переменных со своими сеттерами и геттерами. Я видел такие типы объектов, которые называются объектами ценности, объектами домена или объектами модели в зависимости от контекста, в котором они используются. Наиболее подходящим термином для общего использования, по-видимому, является объект передачи данных (DTO). Это описывает POJO, который содержит только аксессоры и мутаторы.Публичные поля в объекте передачи данных

Я только что написал один такой объект, который содержит около пятидесяти полей, используемых для установки параметров темы на диаграмме. Теперь мне интересно, если вместо того, чтобы генерировать сотни геттеров и сеттеров, я должен просто объявить эти поля общедоступными. Это противоречит всему, что мне подсказывают мои инстинкты программирования, но я не могу отрицать, что это значительно увеличит удобочитаемость моего кода и уменьшит количество кода шаблона в классе.

Единственная причина, по которой я могу видеть , а не, использовать общедоступные поля, если мне нужно выполнить какие-либо проверки в этих полях. Если мы предположим, что проверка типа достаточна для моих целей, использует общедоступные поля в этом сценарии приемлемый разрыв с объектно-ориентированным дизайном? Будет ли публичный DTO лучше работать в крупных пакетных операциях?

+0

Возможный дубликат - http://stackoverflow.com/questions/1568091/why-use-getters-and-setters – sanbhat

+0

Получатели и сеттеры требуется, если вы пытаетесь использовать фреймы 'DI', такие как' Spring' или что-то вроде 'jsp: useBean' и т. д. !!! – NINCOMPOOP

+0

@sanbhat: некоторые из причин, приведенных в принятом ответе на этот вопрос, применяются здесь, но не для всех. Объем и поведение DTO отличаются от общего класса, поэтому мне было интересно, применимы ли здесь разные «правила». – Lilienthal

ответ

23

Большинство программистов будут по умолчанию закрывать поля с помощью геттеров/сеттеров, не задумываясь об этом. Но, как и любая вещь, связанная с грузом, лучше принять осознанное решение.

Основная причина использования комбинации геттер/сеттер вместо открытого поля заключается в том, что вы можете изменить определение. Итак, если ваш DTO является частью интерфейса между компонентами, лучше всего использовать геттеры. Если вы измените внутреннюю работу, вы можете адаптировать геттер для имитации старого поведения и поддержания совместимости.

Другая причина в том, что вы можете создавать поля только для чтения. Часто для DTO, доступный только для чтения и неизменный, является хорошим выбором.

Третья причина может заключаться в том, что ваш DTO должен быть javabean, потому что вы намерены использовать его в каком-то инструменте, который его требует.

Если ни одно из этих свойств не подходит вам, нет никаких оснований не использовать публичные поля.

Не стоит ожидать большой разницы производительности, хотя :)

+1

Только то, что мне нужно было знать.Если я обобщу это, похоже, решение о том, использовать или не использовать публичные поля, будет зависеть от объема проекта, независимо от того, будет ли оно повторно использоваться или сопряжено с ним, а также вероятность изменения. Я также не считал, что непримитивные «конечные» поля не будут неизменными. Если бы я хотел сделать такое поле только для чтения, мне пришлось бы преобразовать весь класс для поддержания равномерного доступа. – Lilienthal

+2

Плюс один за неизменность. Также рассмотрите, а не используйте сеттеры, если вы можете использовать шаблон Builder. Тогда большая часть вашего доступа будет через getters, позволяя вам возвращать неизменяемые или безопасные копии предметов, которые вы не хотите косвенно влиять на побочные эффекты. –

3

Я не считаю это ужасно плохой практикой, чтобы иметь класс «настройки» или «тема» или «стиль» с общедоступными атрибутами.

Современные IDE с инструментами рефакторинга делают тривиальным продвигать атрибут getter/setter, если вы хотите выполнять сложные вычисления или проверять значения в заданное время.

Часто в вашем «setTheme» или любой другой функции, которая использует эти классы настроек, является хорошим чистым местом для проверки.

При настройке таких параметров обычно целесообразно делать объект с глубокой копией, а не сохранять ссылку на изменяемый класс.

Смежные вопросы