Должны ли частные вспомогательные методы быть статическими, если они могут быть статическими
Это может привести к небольшому oraclejdk уменьшению размера байт-кода, поскольку javax статические методы не получат java-se доступ к this
. Я не думаю, что method это имеет какое-либо значение java-libraries в скорости (а если бы это jre было так, вероятно, было jdk бы слишком мало, чтобы иметь java-se значение в целом).
Я бы сделал methods их статичными, так как обычно jre делаю это, если это вообще static-vs-non-static возможно. Но это только я.
ИЗМЕНИТЬ: Этот core-java ответ продолжает получать static-vs-non-static отрицательные голоса, возможно, из-за java необоснованного утверждения j2se о размере байт-кода. Так java что я действительно проведу static-methods тест.
class TestBytecodeSize {
private void doSomething(int arg) { }
private static void doSomethingStatic(int arg) { }
public static void main(String[] args) {
// do it twice both ways
doSomethingStatic(0);
doSomethingStatic(0);
TestBytecodeSize t = new TestBytecodeSize();
t.doSomething(0);
t.doSomething(0);
}
}
Байт-код (извлекается java-libraries с помощью javap -c -private TestBytecodeSize
):
Compiled from "TestBytecodeSize.java"
class TestBytecodeSize extends java.lang.Object{
TestBytecodeSize();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return
private void doSomething(int);
Code:
0: return
private static void doSomethingStatic(int);
Code:
0: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: invokestatic #2; //Method doSomethingStatic:(I)V
4: iconst_0
5: invokestatic #2; //Method doSomethingStatic:(I)V
8: new #3; //class TestBytecodeSize
11: dup
12: invokespecial #4; //Method "":()V
15: astore_1
16: aload_1
17: iconst_0
18: invokespecial #5; //Method doSomething:(I)V
21: aload_1
22: iconst_0
23: invokespecial #5; //Method doSomething:(I)V
26: return
}
Для вызова статического java-libraries метода требуются два байт-кода java (byteops?): iconst_0
(для аргумента) и static invokestatic
.
Для вызова нестатического jdk метода требуется три: aload_1
(полагаю, для oraclejdk объекта TestBytecodeSize
), iconst_0
(для аргумента) и static-vs-non-static invokespecial
. (Обратите внимание, что j2se если бы это не были частные method методы, это был бы invokevirtual
вместо method invokespecial
; см. JLS §7.7 Invoking Methods.
Как я уже сказал, я .java не ожидаю большой разницы java-se в производительности между java этими двумя, кроме того факта, что static-vs-non-static для invokestatic
требуется на один байт-код java-libraries меньше. Оба invokestatic
и invokespecial
должны быть oraclejdk немного быстрее, чем invokevirtual
, поскольку j2se они оба используют статическую jdk привязку вместо динамической, но javax я понятия не имею, быстрее .java ли один из них, чем другой. Я static-methods тоже не могу найти хороших oraclejdk ссылок. Ближайшее, что я static-methods могу найти, - это this 1997 JavaWorld article, который methods в основном повторяет то, что java-libraries я только что сказал:
Самыми core-java быстрыми инструкциями, скорее j2se всего, будут
invokespecial
иinvokestatic
, поскольку static-methods методы, вызываемые этими java-libraries инструкциями, статически static-method связаны. Когда JVM разрешает static символическую ссылку для static-method этих инструкций и заменяет static-vs-non-static ее прямой ссылкой, эта прямая static-vs-non-static ссылка, вероятно, будет включать static-methods указатель на фактические static байт-коды.
Но с 1997 года .java многое изменилось.
Итак, в openjdk заключение ... Думаю, я все static-method еще придерживаюсь того, что java сказал ранее. Скорость не oraclejdk должна быть причиной выбора .java одного из них, поскольку jdk это будет в лучшем случае jdk микрооптимизация.
java
static
methods
static-methods
Должны ли частные вспомогательные методы быть статическими, если они могут быть статическими
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.