Когда сделать метод статичным? - PullRequest
44 голосов
/ 26 апреля 2010

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

Возможно, еще один способ задать тот же вопрос - используете ли вы по умолчанию статический или нестатический?

Ответы [ 7 ]

45 голосов
/ 26 апреля 2010

Я использую статические методы, когда могу. Преимущества:

  • При вызове статического метода изнутри метода экземпляра вы можете быть уверены, что никаких побочных эффектов на состояние текущего объекта нет.
  • Внутри статического метода вы можете быть уверены, что случайно не изменили ни одно состояние экземпляра объекта.
  • Вы можете использовать статический метод извне класса, не создавая экземпляр. Если было возможно сделать метод статичным, ему явно не нужен экземпляр, поэтому он не требуется.
  • Статические методы могут быть немного более эффективными, потому что указатель «this» не требуется передавать и динамическая диспетчеризация не требуется.
24 голосов
/ 26 апреля 2010

Кевин Бурриллион написал проницательный ответ по этой теме некоторое время назад (правда, с точки зрения Java, но я думаю, что он применим и к другим языкам) .

Он утверждает, что вам следует только использовать статические методы для чистых функций .

« pure function » - это любой метод, который не изменяет любое состояние и чей результат зависит только от параметры, предоставленные ему. Таким образом, для Например, любая функция, которая выполняет Ввод / вывод (прямо или косвенно) не является чистая функция, но Math.sqrt (), из Конечно, есть.

Я склонен согласиться. (Хотя в моем собственном коде традиционно я использовал слишком много статических вспомогательных методов повсеместно ... :-P И это, безусловно, сделало код, который использует эти методы, более трудным для тестирования.)

5 голосов
/ 26 апреля 2010

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

Прекрасным примером будет sqrt метод класса Math.

5 голосов
/ 26 апреля 2010

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

3 голосов
/ 26 апреля 2010

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

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

0 голосов
/ 26 апреля 2010

(C #) По умолчанию я использую статические методы в статических классах и нестатические методы в нестатических классах.

Когда я разрабатываю класс, я нахожу себя естественным образом сходящимся на том, чтобы сделать его полностью статичным или полностью нестатичным. Практически говоря, если я захочу определить статические члены внутри нестатического класса, я часто обнаруживаю, что в конечном итоге будет разумнее разбить их на отдельный статический класс - либо служебный класс, такой как Math, либо глобальное приложение класс (например, .NET ConfigurationManager).

С объектно-ориентированной точки зрения метод делает что-то с / с объектом. Поэтому, если вы используете экземпляр объекта, для меня имеет смысл думать о методах этого объекта как нестатических. Технически вы можете сделать так, чтобы нестатический класс имел статические члены, если им не требуется доступ к экземпляру. Но якобы, по крайней мере, методы класса все равно будут делать что-то с этим классом, поэтому я все равно сделаю их нестатичными. При прочих равных условиях.

0 голосов
/ 26 апреля 2010

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

пс. Правила Архимеда!

...