2009-09-17 4 views
7

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

Однако, какова точка зрения на использование этой техники, чтобы избежать множественных приемов? На данный момент я столкнулся с выбором между:

if (a instanceof Foo) { 
    // Cast once and assign to local variable. 
    Foo foo = (Foo)a; 

    if (foo.getB() == 1 && foo.getC() == 2) { 
    ... 
    } 
} 

ИЛИ

if (a instanceof Foo) { 
    // Cast twice making code compact but possibly less readable. 
    // Also, is there an overhead in multiple casts? 
    if (((Foo)a).getB() == 1 && ((Foo)a).getC() == 2) { 
    ... 
    } 
} 

ответ

12

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

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

3

Я предпочитаю первый, как это выглядит более чистым. Второй начинает выглядеть как Lisp. Но это всего лишь личное мнение.

+0

Что не так с Lisp? –

+2

Ничего, я люблю Лиспа, у него просто много круглых скобок, вот и все. –

19

Я предпочитаю создавать локальную переменную, а не всегда отливать из-за проблем с читабельностью. Чтение кода, для меня (или других разработчиков, работающих с одним и тем же кодом), является важной проблемой.

Беспокойство о производительности на этом этапе поражает меня как пример шаблона «преждевременной оптимизации».

+0

Спасибо - это на самом деле уже мой предпочтительный подход; Я просто хотел получить подтверждение от сообщества программистов. – Adamski

1

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

3

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

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

1

Я предпочитаю первый вариант, по двум причинам

  1. Необходимые круглые скобки сделать код cludgy и трудно читать
  2. Там это возможно (маленький) накладные расходы в гипсе
0

I предпочитают первый, а не только для чтения кода, но для среды отладки во время выполнения (также для исходного примера - если вы помещаете результат getter в локальный, вы видите это значение, а не трассировку в геттер в первый раз) ,

0

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

Смежные вопросы