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

Это может привести к небольшому 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

2022-09-14T18:45:51+00:00
Вопросы с похожей тематикой, как у вопроса:

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