Между этими двумя блоками были бы какие-либо различия в производительности?
public void doSomething(Supertype input)
{
Subtype foo = (Subtype)input;
foo.methodA();
foo.methodB();
}
по сравнению с.
public void doSomething(Supertype input)
{
((Subtype)input).methodA();
((Subtype)input).methodB();
}
Какие-либо другие соображения или рекомендации между этими двумя?
Ну, скомпилированный код, вероятно, включает двойное приведение во втором случае, поэтому теоретически выполняет одну и ту же работу дважды. Однако вполне возможно, что умная JIT сработает, что вы выполняете одно и то же приведение к одному и тому же значению, поэтому он может кэшировать результат. Но он должен выполнить работу хотя бы один раз - в конце концов, он должен принять решение о том, разрешить ли приведение к успешному выполнению или создать исключение.
Как всегда, вы должны тестировать и профилировать свой код, если вам важна производительность - но я лично все равно использовал бы первую форму, просто потому, что она мне кажется более читаемой.
Вы можете указать его в манифесте, используя манифест вложенный элемент MAR . Set Главный класс
к требуемому классу.
В первом случае:
Subtype foo = (Subtype)input;
Это определяется в компиляционном времени, поэтому нет стоимости во время выполнения.
Во втором случае:
((Subtype)input).methodA();
Это определяется во время выполнения, потому что компилятор не узнает. JVM должен проверить, может ли он преобразовать в ссылку в ссылку подтип
, а если не бросить классов класса
и т. Д. Так что будет какая-то стоимость.
Согласно этой статье , существует стоимость, связанная с литьем.
Пожалуйста, обратите внимание, что статья датирована 1999 годом, и читатель сам решает, является ли информация все еще достоверной!
Да. Проверки должны выполняться с каждым забросом вместе с фактическим механизмом литья, поэтому многократное забросание будет стоить дороже, чем однократное. Однако компилятор, скорее всего, оптимизирует именно такие вещи. Он может ясно видеть, что input не изменил свой тип с момента последнего приведения и должен иметь возможность избежать множественного приведения - или, по крайней мере, избежать некоторых проверок приведения.
В любом случае, если вы действительно , беспокоитесь об эффективности, я бы поинтересовался, является ли Java языком, который вам следует использовать.
Лично я бы сказал использовать первый. Он не только более читабелен, но и упрощает изменение типа позже. Вам нужно будет изменить его только в одном месте, а не каждый раз, когда вы вызываете функцию для этой переменной.