Когда метод должен быть статическим? - PullRequest
33 голосов
/ 08 сентября 2008

Кроме того, есть ли какие-либо преимущества в производительности у статических методов по сравнению с методами экземпляров?

Недавно я обнаружил следующее: http://www.cafeaulait.org/course/week4/22.html:

Когда метод должен быть статическим?

  1. Ни чтение, ни запись в поля экземпляра
  2. Не зависит от состояния объекта
  3. Математические методы, которые принимают аргументы, применяют алгоритм к тем аргументы и вернуть значение
  4. Фабричные методы, которые служат вместо конструкторов

Мне было бы очень интересно узнать мнение сообщества Stack Overflow по этому вопросу.

Ответы [ 8 ]

22 голосов
/ 08 сентября 2008

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

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

19 голосов
/ 08 сентября 2008

Является ли метод статичным или нет, это скорее вопрос проектирования, чем вопрос эффективности. Статический метод принадлежит классу, где нестатический метод принадлежит объекту. Если у вас есть класс Math, у вас может быть несколько статических методов для работы с сложением и вычитанием, потому что это понятия, связанные с Math. Однако, если у вас был класс Car, у вас может быть несколько нестатических методов переключения передач и управления, потому что они связаны с конкретным автомобилем, а не с концепцией автомобилей в целом.

12 голосов
/ 08 сентября 2008

Другая проблема со статическими методами заключается в том, что писать для них модульные тесты довольно болезненно - по крайней мере, на Java. Вы не можете издеваться над статическим методом в любом случае. В блоге тестирования Google есть сообщение об этой проблеме .

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

2 голосов
/ 08 сентября 2008

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

Вы пишете процедурный код, поэтому, если имеет смысл быть процедурным, тогда делайте это. Если нет, то это должен быть метод экземпляра.

Эта идея взята из статьи Стива Йегге , которая, на мой взгляд, интересна и полезна для чтения.

2 голосов
/ 08 сентября 2008

@ jagmal Я думаю, что вы где-то пересекли провода - все примеры, которые вы перечислили, явно не являются статическими.

Статические методы должны иметь дело исключительно с абстрактными свойствами и концепциями класса - они никоим образом не должны относиться к конкретным атрибутам экземпляра (и большинство компиляторов будут кричать, если они это сделают).

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

1 голос
/ 08 сентября 2008

С точки зрения производительности, статический метод C ++ может быть немного быстрее, чем не виртуальный метод экземпляра, так как нет необходимости указателя this для передачи в метод. В свою очередь, оба будут быстрее, чем виртуальные методы, поскольку поиск VMT не требуется.

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

0 голосов
/ 04 августа 2015

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

0 голосов
/ 08 сентября 2008

Здесь приведено соответствующее обсуждение , почему String.Format является статическим , что высветит некоторые причины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...