Методы класса против методов экземпляра - PullRequest
10 голосов
/ 01 июля 2011

Привет Методы класса, как правило, измеряются быстрее, чем методы экземпляра, так как он не требует загрузки экземпляра?Если так, должны ли мы использовать методы класса, когда это возможно?Спасибо

Ответы [ 9 ]

12 голосов
/ 01 июля 2011

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

  • Вы не можете @Override статический метод!

Это очень важно, потому что вы, по сути, говорите, что не будете и не сможете использовать одно из главных преимуществ в Java, а именно переопределение методов в подклассовых объектах.Когда вы вызываете статический метод, вы остаетесь с этим статическим методом и не можете переопределить его в подклассифицированных объектах.

Кроме того, чтобы разрешить «что быстрее», затем построить тест REAL ,не просто микробенчмарк для исследования фактических результатов.Для измерения используйте несколько JVM, потому что реализация JIT может повлиять на это.

4 голосов
/ 01 июля 2011

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

мы должны использовать методы класса, когда возможно

имеет положительный ответ.

Но определенно НЕ по соображениям эффективности

3 голосов
/ 01 июля 2011

Нет, они НЕ быстрее.

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

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

2 голосов
/ 01 июля 2011

пожалуйста, посмотрите на ссылку

http://www.leepoint.net/notes-java/flow/methods/50static-methods.html

2 голосов
/ 01 июля 2011

«Метод класса» доступен для каждого экземпляра класса, а «методы экземпляра» - для текущего экземпляра.Так что я не понимаю, почему метод класса будет быстрее, когда он применяется ко всем случаям ...

1 голос
/ 08 июля 2011

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

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

Так что в любом случае не существует «Метод класса> Метод экземпляра» или наоборот.Это просто зависит от вашего приложения и того, что вам нужно.Прежде всего, руководствуйтесь здравым смыслом, если вы обнаружите, что инициализируете объекты для классов, которые содержат минимальные данные (например, MathFunctions), возможно, вам лучше использовать метод класса.
Но, с другой стороны, если вы обнаружите, что инициализируете объекты, то передаваете их в класс.Методы в качестве аргументов, вам, скорее всего, будет лучше с методом экземпляра.

Это мои два цента, я все еще относительно новичок в программировании, так что имейте это в виду.

1 голос
/ 01 июля 2011

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

Так что вопросстановится, "мой метод будет быстрее, если у него будет на один параметр меньше?"и этот вопрос на самом деле не имеет смысла, поскольку список параметров в значительной степени не имеет отношения к производительности.

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

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

1 голос
/ 01 июля 2011

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

0 голосов
/ 01 июля 2011

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

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

...