Java

Стоит ли во всех случаях сделать методы класса статичным, если они не используют абсолютно никакое поле класса?

Бывают ли исключения?
По моей логике, если метод класса не использует никаких его полей, то он обязательно должен быть статическим.
Я бы подошел к проблеме с другого конца.
Метод имеет смысел делать статическим только С ЦЕЛЬЮ ЯВНО ЗАПРЕТИТЬ ему использовать поля класса. А это, в свою очередь, имеет смысел только если он будет использоваться "снаружи" класса без создания экземпляра.
В остальных случаях лично я не вижу смысла навешивать на метод такое ограничение. Вдруг, скажем, ты захочешь в будущем сделать этот метод виртуальным? А там стоит грозный static, и поди пойми, ты его просто по приколу поставил 8 лет назад или все же это было сделано с каким-то явным намереньем и виртуальным метод делать нельзя.
Ramin Balaev
Ramin Balaev
81 427
Лучший ответ
Дамир Биктимиров Да, вот про это я не подумал.
Если метод использует только поля класса и не использует поля объекта этого класса, его вполне можно сделать статическим. Но надо ли делать, зависит от того, как этот метод используется.

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

Если же объект этого класса существует (по причинам, не связанным с этим методом) в любом месте, где используется этот метод, делать его статическим не имеет смысла: хотя метод и не использует поля объекта, но вне объекта не используется.
Фёдор Епишев
Фёдор Епишев
81 286
Дамир Биктимиров Думаю, в любом случае лучшей практикой будет — делать все методы класса/объекта статичными, если они не используют никакое поле.
Обычно статические классы дсоздают в исключительных случаях, поэтому не замарачивайся и просто не думай о них, используй обычные классы.
Ваша логика перевернута с ног на голову. Методы класса первичны, посколько определяют его интерфейс иными словами поведение. Поля, добавляются потом, такие и столько, сколько нужно, чтобы этот интерфейс реализовать. И это внутреннее дело класса. Поэтому определение методов исходя из полей, это ущербная логика. Примерно также, как механическое добавление геттера и сеттера к каждому полю.
***vip*** Mr.nikonov
***vip*** Mr.nikonov
2 141
Влад Лисенков Добавлю: Если не знаешь зачем делать конкретный метод статическим - тебе не нужно делать его статическим :)
Дамир Биктимиров Я считаю, что бессмысленно определять интерфейсы, если их методы не будут использовать поля объекта, так как всё то, что будет предоставлять этот интерфейс, смогут использовать только экземпляры данного класса. В ином случае — у всех будет доступ к методу класса.

Я хочу сказать, что имеет смысл определять только те интерфейсы, чей реализация будет использовать хоть одно поле класса.
***vip*** Mr.nikonov "Я хочу сказать, что имеет смысл определять только те интерфейсы, чей реализация будет использовать хоть одно поле класса."

Я не знаю, как вам объяснить. Интерфейс определяется еще когда нет никаких полей вообще от слова совсем. Поэтому что там тот или иной метод использует определяется потом, и может достаточно просто изменятся, в отлличие от самого интерфейса.
***vip*** Mr.nikonov "Как круто было бы воспользоваться данным методом примерно так:"

Конечно "круто". Только это ничего не меняет, вы не поняли, что я хотел сказать. Вы определяете этот и подобные ему методы статическими еще до добавления каких либо полей. А так, как эти методы статические, для их реализации либо никаких полей не нужно, либо нужны статические поля. Неужели непонятно?

Попробую другими словами - то, как вы определяете открытый интерфейс класса определяет, какой набор закрытых полей вам будет нужен. А не наоборот, я напихал туда полей, а потом создаю методы и смотрю, а пользуется он полями или нет. То есть методы определяют, какими и сколько будет полей, а не наоборот.