2012-01-10 3 views

ответ

9

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

0

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

2

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

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

4

В зависимости от того, что вы подразумеваете под типом. Существует «повышение», которое вам ничего не стоит, и есть «понижение», которое вам очень дорого стоит. Ответ на второй также начинается с «это зависит». Обычно я избегаю понижения в моем коде, потому что, с моей экспроприации, если это чрезмерно используется в вашем коде, это означает, что дизайн плохой. Что, с другой стороны, не обязательно должно означать, что его вообще нельзя использовать.

+2

+1: Хотя это может стоить немного с точки зрения производительности, хороший дизайн является более важной причиной, чтобы избежать его. ;) –

4

JavaWorld: The cost of casting

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

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

потупив операции (также называемые преобразования сужающейся в спецификации языка Java в ) преобразовать ссылку на класс предка к подклассу ссылки. Эта операция литья создает накладные расходы на выполнение, так как Java требует, чтобы приведение было проверено на этапе исполнения , чтобы убедиться, что оно действительно. Если указанный объект не является экземпляра либо целевого типа для отлитых или подкласса этого типа, попытки броска не допускается и должен бросить java.lang.ClassCastException.