Бывают ли исключения?
По моей логике, если метод класса не использует никаких его полей, то он обязательно должен быть статическим.
Java
Стоит ли во всех случаях сделать методы класса статичным, если они не используют абсолютно никакое поле класса?
Я бы подошел к проблеме с другого конца.
Метод имеет смысел делать статическим только С ЦЕЛЬЮ ЯВНО ЗАПРЕТИТЬ ему использовать поля класса. А это, в свою очередь, имеет смысел только если он будет использоваться "снаружи" класса без создания экземпляра.
В остальных случаях лично я не вижу смысла навешивать на метод такое ограничение. Вдруг, скажем, ты захочешь в будущем сделать этот метод виртуальным? А там стоит грозный static, и поди пойми, ты его просто по приколу поставил 8 лет назад или все же это было сделано с каким-то явным намереньем и виртуальным метод делать нельзя.
Метод имеет смысел делать статическим только С ЦЕЛЬЮ ЯВНО ЗАПРЕТИТЬ ему использовать поля класса. А это, в свою очередь, имеет смысел только если он будет использоваться "снаружи" класса без создания экземпляра.
В остальных случаях лично я не вижу смысла навешивать на метод такое ограничение. Вдруг, скажем, ты захочешь в будущем сделать этот метод виртуальным? А там стоит грозный static, и поди пойми, ты его просто по приколу поставил 8 лет назад или все же это было сделано с каким-то явным намереньем и виртуальным метод делать нельзя.
Дамир Биктимиров
Да, вот про это я не подумал.
Если метод использует только поля класса и не использует поля объекта этого класса, его вполне можно сделать статическим. Но надо ли делать, зависит от того, как этот метод используется.
Если в каком-то участке кода объект этого класса создаётся только для того, чтобы вызвать этот метод - такой метод безусловно надо переводить в статические.
Если же объект этого класса существует (по причинам, не связанным с этим методом) в любом месте, где используется этот метод, делать его статическим не имеет смысла: хотя метод и не использует поля объекта, но вне объекта не используется.
Если в каком-то участке кода объект этого класса создаётся только для того, чтобы вызвать этот метод - такой метод безусловно надо переводить в статические.
Если же объект этого класса существует (по причинам, не связанным с этим методом) в любом месте, где используется этот метод, делать его статическим не имеет смысла: хотя метод и не использует поля объекта, но вне объекта не используется.
Дамир Биктимиров
Думаю, в любом случае лучшей практикой будет — делать все методы класса/объекта статичными, если они не используют никакое поле.
Обычно статические классы дсоздают в исключительных случаях, поэтому не замарачивайся и просто не думай о них, используй обычные классы.
Ваша логика перевернута с ног на голову. Методы класса первичны, посколько определяют его интерфейс иными словами поведение. Поля, добавляются потом, такие и столько, сколько нужно, чтобы этот интерфейс реализовать. И это внутреннее дело класса. Поэтому определение методов исходя из полей, это ущербная логика. Примерно также, как механическое добавление геттера и сеттера к каждому полю.
Влад Лисенков
Добавлю: Если не знаешь зачем делать конкретный метод статическим - тебе не нужно делать его статическим :)
Дамир Биктимиров
Я считаю, что бессмысленно определять интерфейсы, если их методы не будут использовать поля объекта, так как всё то, что будет предоставлять этот интерфейс, смогут использовать только экземпляры данного класса. В ином случае — у всех будет доступ к методу класса.
Я хочу сказать, что имеет смысл определять только те интерфейсы, чей реализация будет использовать хоть одно поле класса.
Я хочу сказать, что имеет смысл определять только те интерфейсы, чей реализация будет использовать хоть одно поле класса.
***vip*** Mr.nikonov
"Я хочу сказать, что имеет смысл определять только те интерфейсы, чей реализация будет использовать хоть одно поле класса."
Я не знаю, как вам объяснить. Интерфейс определяется еще когда нет никаких полей вообще от слова совсем. Поэтому что там тот или иной метод использует определяется потом, и может достаточно просто изменятся, в отлличие от самого интерфейса.
Я не знаю, как вам объяснить. Интерфейс определяется еще когда нет никаких полей вообще от слова совсем. Поэтому что там тот или иной метод использует определяется потом, и может достаточно просто изменятся, в отлличие от самого интерфейса.
***vip*** Mr.nikonov
"Как круто было бы воспользоваться данным методом примерно так:"
Конечно "круто". Только это ничего не меняет, вы не поняли, что я хотел сказать. Вы определяете этот и подобные ему методы статическими еще до добавления каких либо полей. А так, как эти методы статические, для их реализации либо никаких полей не нужно, либо нужны статические поля. Неужели непонятно?
Попробую другими словами - то, как вы определяете открытый интерфейс класса определяет, какой набор закрытых полей вам будет нужен. А не наоборот, я напихал туда полей, а потом создаю методы и смотрю, а пользуется он полями или нет. То есть методы определяют, какими и сколько будет полей, а не наоборот.
Конечно "круто". Только это ничего не меняет, вы не поняли, что я хотел сказать. Вы определяете этот и подобные ему методы статическими еще до добавления каких либо полей. А так, как эти методы статические, для их реализации либо никаких полей не нужно, либо нужны статические поля. Неужели непонятно?
Попробую другими словами - то, как вы определяете открытый интерфейс класса определяет, какой набор закрытых полей вам будет нужен. А не наоборот, я напихал туда полей, а потом создаю методы и смотрю, а пользуется он полями или нет. То есть методы определяют, какими и сколько будет полей, а не наоборот.
Похожие вопросы
- Java методы классы
- Что делает store_(число) и load_(число) в байткоде метода класса?
- Класс String и его методы
- Стоит ли использовать Iterable вместо Set?
- Помогите пожалуйста написать методы,java, Кто даст ответ дам 100 балов подарком ОТВЕТ ДАЙТЕ СЕГОДНЯ ЭТО СРОЧНО!!!!!!!!!!
- Что такое класс, метод и объект в языке программирования java?
- Помогите с заданием, я примерно понимаю почему стоит переместить этот метод, но хочу удостовериться, послушав ваше мнени
- В этом коде сделать так чтобы был ОДИН метод, (а не 3, как в коде) позволяющий вводить с клавиатуры его характеристики
- Можно ли реализовать полиморфизм (Java) с общим конструктором для разных дочерних классов?
- Где лучше обрабатывать исключения, напрямую в методе который их может создать или пробрасывать дальше через throws