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

Методы класса и методы экземпляра

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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

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