Последствия эффективности анонимного класса Java

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

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

Используя анонимные объекты:

void doSomething() {
    for (/* Assume some loop */) {
        final Object obj1, obj2; // some free variables

        IWorker anonymousWorker = new IWorker() {
            doWork() {
                // do things that refer to obj1 and obj2
            }
        };
    }
}

Определение класса сначала:

void doSomething() {
    for (/* Assume some loop */) {
        Object obj1, obj2;
        IWorker worker = new Worker(obj1, obj2);
    }
}

static class Worker implements IWorker {
    private Object obj1, obj2;
    public CustomObject(Object obj1, Object obj2) {/* blah blah */}

    @Override
    public void doWork() {}
};
27
задан Bacteria 21 December 2015 в 15:40
поделиться

4 ответа

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

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

40
ответ дан 28 November 2019 в 04:15
поделиться

Разницы в производительности не должно быть никакой. Если есть разница, она будет на уровне, о котором не стоит беспокоиться.

ИМО, вам следует сосредоточиться на написании кода, который будет читаемым и поддерживаемым, и игнорировать "микро" проблемы с производительностью до тех пор, пока у вас не будет четких свидетельств того, что они значительны ... на основе профилирования приложения.

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

20
ответ дан 28 November 2019 в 04:15
поделиться

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

Таким образом, любая разница в производительности между двумя подходами незначительна. Важными факторами, которые следует учитывать, являются такие вещи, как удобочитаемость, возможность повторного использования, тестируемость и т. Д.

18
ответ дан 28 November 2019 в 04:15
поделиться

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

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

0
ответ дан 28 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

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