schursin
@schursin

К любителям Java?

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


Есть ли смысл (по ресурсам, быстродействию или ?) в преобразовании:

public class A
{
    private final int a;
    private final Map<Integer, Integer> map;

    public A(int a)
    {
        this.a = a;
        this.map = new HashMap<Integer, Integer>();
    }

    public int calcSomthing()
    {
        int b = 0;

        for (int i : map.values())
            if (i == a)
                b++;

        return b;
    }
}



в

public class A
{
    // ...

    public int getA()
    {
        return a;
    }

    public Collection<Integer> getValues()
    {
        return map.values();
    }

    public static int calcSomthing(A obj)
    {
        int b = 0;

        for (int i : obj.getValues())
            if (i == obj.getA())
                b++;

        return b;
    }
}



Если учитывать, что объектов много, скажем тысяч 50.


Или смыл будет только, если, выносить в static те методы, которые изначально не обращается напрямую к переменным класса, а используют только другие методы класса?
  • Вопрос задан
  • 2646 просмотров
Решения вопроса 1
apangin
@apangin
Ответ: нет, такими преобразованиями заниматься не стоит. Сгенерированный JIT-компилятором код для обоих вариантов будет практически одинаков, зато первый вариант выглядит понятнее и идеологически правильнее. Не забивайте себе голову тем, что вызов статического метода якобы быстрее виртуального. На самом деле, за счет динамической девиртуализации JVM сможет вызывать метод напрямую, минуя vtable. Более того, в некоторых случаях вызов статического метода может оказаться даже хуже из-за class initialization barrier. В целом, пишите так, как лучше с точки зрения архитектуры и концепций ООП.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
javax
@javax
Software Architect, Java Developer since 1996
читаемость и преобразуемость кода важнее выгоды в несколько комманд
Ответ написан
Комментировать
@MaximKat
Сильно сомневаюсь что будет какая-либо разница в принципе. Передается объект явно как параметр или неявно как this на производительность не влияет.

Для 100% гарантии надо провести следственный эксперимент или вооружиться дизассемблером.
Ответ написан
@MaximKat
Подумал и пришел к выводу что я неправ. Разница может быть, т.к. если метод виртуальный, то возможен полиморфизм, т.е. нужно найти какой именно метод вызывать. В случае статического метода, все известно уже на этапе компиляции, поэтому дополнительной рантайм обработки не надо. Т.е. в общем случае, при прочих равных, статический метод будет быстрее.
Ответ написан
@MaximKat
Вот тут еще интересно почитать
Основная идея: static или private быстрее чем public.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы