Подтвердить что ты не робот

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

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

В последнее время я встретил следующее: http://www.cafeaulait.org/course/week4/22.html:

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

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

Я бы очень интересовался отзывами сообщества Qaru об этом.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 8

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