Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top