Есть ли обстоятельства, когда приемлемо использовать публичное поле вместо методов getter/setter?
Основная причина, по которой общественные поля являются плохими, заключается в том, что они раскрывают реализацию для внешнего мира. Это приводит к нежелательной связи; то есть классы, которые чрезмерно зависят от деталей реализации других классов. Это, как правило, делает код более трудным для понимания и сложнее изменить. И если поле не final
, вам нужно найти всю базу кода, чтобы быть уверенно, что ничего не мешает «поле». (ОК, IDE упрощают это ... но контрастируют с открытым полем с частным полем, у которого нет сеттера.)
Вторая причина в том, что вы не можете переопределить поле. После того, как вы выставили поле в суперклассе, вы ничего не можете сделать в подклассе, который может изменить или ограничить его значение. (В отличие от этого, геттеры и сеттеры могут быть переопределены ...)
Единственная ситуация, когда приемлемо (с стилистической точки зрения) иметь «общедоступные» поля, когда класс, объявляющий поля, является частным вложенным или внутренний класс. Следствием этого является то, что все зависимости от поля ограничены исходным файлом, который содержит декларацию ... что отрицает вышеперечисленные проблемы.
ОБНОВЛЕНИЕ - Я забыл public static final
... но мы склонны вообще не думать о них как о полях. В любом случае, обычной практикой является доступ к полям public static final
. Идея константы заключается в том, что намеренно выставляет имя, тип и значение ... и проблема переопределения не применяется из-за природы статических полей.
Я в настоящее время метод получения, чтобы получить пул, который работает хорошо, но, кажется, немного неуклюжий.
«Неуклюжий» - это вопрос мнения/вкуса. Лично я не думаю, что obj.getInstance()
неуклюжий по сравнению с obj.instance
. Это просто способ Java .
Флипсайд - это то, что если у вас не было метода getInstance()
, все классы, которые использовали пул, должны были иметь жестко закодированные ссылки на поле instance
. Если (по некоторым причинам) вам нужно было что-то изменить о путях доступа к пулу (например, добавьте проверку безопасности, добавьте счетчик, сделайте создание пула ленивым, убедитесь, что доступ правильно синхронизирован), тогда вы должны изменить каждый и каждое место, где вы закодировали ссылку на поле. Но с геттером у вас просто есть одно место для изменения.
1 - Очевидно, что другие языки делают это по-другому. Но вы не пишете эти языки. Java - это то, что есть.
Конечные константы, например, не нужны setter & getter – donfuxx
Если вы хотите, и нет спецификации, которая бы помешала ей. В публичных полях ничего не происходит неправильно, просто не рекомендуется, если кто-то намеревается создать «безопасный» API, который нельзя отбросить с помощью интерфейсов, противоречащих вашим намерениям. –
Я думаю, что это вопрос, основанный на мнениях, если честно. Независимо от того, используете ли вы публичный модификатор, действительно ли вы и ваша команда разработчиков. Если вы пишете библиотеку, предназначенную для использования широкой публикой, вам следует избегать предоставления открытого доступа к полям, которые могут изменить состояние вашего объекта. Если это то, что только когда-либо будет использоваться внутри, то это зависит от вашей команды разработчиков. Вы должны подтвердить, что изменение значений публичных полей может иметь странные эффекты, поэтому сделайте это только в том случае, если вы знаете, что делаете. – Jared