2014-04-22 5 views
2

У меня есть основной класс с пулом потоков, который используется довольно многими другими классами для выполнения действий в базе данных. В настоящее время у меня есть метод getter, чтобы получить пул, который отлично работает, но кажется немного неуклюжим.Когда используются общедоступные поля?

Существуют ли какие-либо обстоятельства, когда приемлемо использовать публичное поле вместо методов getter/setter?

+4

Конечные константы, например, не нужны setter & getter – donfuxx

+0

Если вы хотите, и нет спецификации, которая бы помешала ей. В публичных полях ничего не происходит неправильно, просто не рекомендуется, если кто-то намеревается создать «безопасный» API, который нельзя отбросить с помощью интерфейсов, противоречащих вашим намерениям. –

+0

Я думаю, что это вопрос, основанный на мнениях, если честно. Независимо от того, используете ли вы публичный модификатор, действительно ли вы и ваша команда разработчиков. Если вы пишете библиотеку, предназначенную для использования широкой публикой, вам следует избегать предоставления открытого доступа к полям, которые могут изменить состояние вашего объекта. Если это то, что только когда-либо будет использоваться внутри, то это зависит от вашей команды разработчиков. Вы должны подтвердить, что изменение значений публичных полей может иметь странные эффекты, поэтому сделайте это только в том случае, если вы знаете, что делаете. – Jared

ответ

2

Есть ли обстоятельства, когда приемлемо использовать публичное поле вместо методов getter/setter?

Основная причина, по которой общественные поля являются плохими, заключается в том, что они раскрывают реализацию для внешнего мира. Это приводит к нежелательной связи; то есть классы, которые чрезмерно зависят от деталей реализации других классов. Это, как правило, делает код более трудным для понимания и сложнее изменить. И если поле не final, вам нужно найти всю базу кода, чтобы быть уверенно, что ничего не мешает «поле». (ОК, IDE упрощают это ... но контрастируют с открытым полем с частным полем, у которого нет сеттера.)

Вторая причина в том, что вы не можете переопределить поле. После того, как вы выставили поле в суперклассе, вы ничего не можете сделать в подклассе, который может изменить или ограничить его значение. (В отличие от этого, геттеры и сеттеры могут быть переопределены ...)

Единственная ситуация, когда приемлемо (с стилистической точки зрения) иметь «общедоступные» поля, когда класс, объявляющий поля, является частным вложенным или внутренний класс. Следствием этого является то, что все зависимости от поля ограничены исходным файлом, который содержит декларацию ... что отрицает вышеперечисленные проблемы.

ОБНОВЛЕНИЕ - Я забыл public static final ... но мы склонны вообще не думать о них как о полях. В любом случае, обычной практикой является доступ к полям public static final. Идея константы заключается в том, что намеренно выставляет имя, тип и значение ... и проблема переопределения не применяется из-за природы статических полей.


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

«Неуклюжий» - это вопрос мнения/вкуса. Лично я не думаю, что obj.getInstance() неуклюжий по сравнению с obj.instance. Это просто способ Java .

Флипсайд - это то, что если у вас не было метода getInstance(), все классы, которые использовали пул, должны были иметь жестко закодированные ссылки на поле instance. Если (по некоторым причинам) вам нужно было что-то изменить о путях доступа к пулу (например, добавьте проверку безопасности, добавьте счетчик, сделайте создание пула ленивым, убедитесь, что доступ правильно синхронизирован), тогда вы должны изменить каждый и каждое место, где вы закодировали ссылку на поле. Но с геттером у вас просто есть одно место для изменения.

1 - Очевидно, что другие языки делают это по-другому. Но вы не пишете эти языки. Java - это то, что есть.

1

Существует множество причин использования геттера & setter вместо публичного поля. Один я нашел в ТАК

Потому что 2 недели (месяцы, годы) от теперь, когда вы понимаете, что ваш сеттер должен делать больше, чем просто установить значение, вы также будете понимать, что собственности используется непосредственно в 238 других классов :-)

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

+0

Но на самом деле вероятность такого возникновения невероятно низка. –

+0

Да, я знаю, поэтому я сказал, что решение о том, использовать ли общественное поле, зависит от разработчика. – anirudh

+0

Для таких вещей, как строка, имеет смысл инкапсулировать их, но для чего-то вроде пула потоков это не имеет смысла (для меня так или иначе), чтобы сделать что-то вроде someInstance.getThreadPool(). Execute (...), когда вы могли просто сделайте someClass.threadPool.execute (...). – user2248702

1

Сохранение полей класса в частном порядке и использование методов геттера/сеттера обеспечивает уровень абстракции и упрощает его поддержку в долгосрочной перспективе. См. Это: What's the deal with Java's public fields?

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