2014-10-26 3 views
0

Я знаю из JLS, что расширение предпочтительнее бокса, а бокс предпочтительнее, чем var-args.Почему бокс предпочтительнее вар-арг?

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

  1. Почему бокс предпочтительнее вар-аргов?
  2. Как за кулисами интерпретируется бокс и var-args?

Может ли кто-нибудь объяснить пример?

Как я понимаю, Var-args в основном строят Arraytype для хранения количества предоставленных параметров. Поскольку я знаю, что массив является объектом. Я хотел бы продемонстрировать свое замешательство в этом примере.

// 1 Object is made which is basically a wrapper 
public void boxing(Integer i); 
// 1 object made which is an Array 
public void boxing(int.. x) 

В обоих случаях один объект выполнен. Тогда первый путь быстрее, чем позже?

Спасибо,

+0

IMO, имеет смысл сохранить переменной длины самый низкий приоритет. Что касается вашего второго вопроса (* Как за кулисами бокс и var-args интерпретируется? *), Я этого не понимаю. – NPE

+0

Моя вторая точка означает, что как компилятор интерпретирует var-args за сценой, делает ли он какой-то массив? – benz

+0

http://stackoverflow.com/questions/4524079/why-primitive-type-will-call-first-rather-than-wrapper-classes –

ответ

2

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

Теперь, по соображениям производительности, вы можете выбрать один над другим во многих случаях, потому что создание объектов без необходимости - это расход, который вам не нужно платить. Вот почему существует много раз, когда метод var-arg поставляется со своими двоюродными братьями с нулевым аргументом, одним-arg, двумя-arg и тремя-arg. Различные эквивалентные вызовы связываются перед версией var-arg, обеспечивая более быстрый путь для (по-видимому, общих) версий аргументов с низким аргументом аргумента var-arg.

Где люди могут использовать var-args по боксу, где они склонны к var-arg в общий список типов, например (Object ... parameters) over (Int x, Float precision, Boolean visible), но это просто плохая практика, на мой взгляд.

--- Редактирование ответ в ответ на редактирование вопроса ---

Так два сценария

// 1 Object is made which is basically a wrapper 
public void boxing(Integer i); 

// 1 object made which is an Array 
public void boxing(int.. x) 

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

Так функционально, последний один неверен, когда называется как

boxing(5, 4); 

И производительность мудрый, это также удар, когда называется как

boxing(null); 

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

Итак, если у вас есть необязательный один примитивный аргумент, используйте бокс вместо var-args, потому что varargs является концептуально неправильным (путем предоставления дополнительных параметров), а в случае отсутствия значения - для создания массива нулевой длины).

Примечание: для вызова нулевого параметра для работы во многих случаях вам нужно сделать бросок.

boxing((Integer)null); 

И я могу только представить, какой бокс shennagins это создало бы, если вы пробовали

boxing((int)null); 
+0

ноль-arg, двоюродные братья с двумя аргами, методы с нулевым аргументом и один аргумент? Я понял ваши вопросы. Спасибо, тонна Эдвина. – benz

+1

Да, как серия связанных вызовов в одном классе; 'func (Integer first)', 'func (Integer first, Integer second)', 'func (Integer first, Integer second, Integer third)', 'func (Integer ... ints)'. Единственная причина, по которой существует определенное количество вызовов arg, заключается в том, чтобы предотвратить создание бокса для создания массива, что является улучшением производительности для вызовов с низким аргументом. –

+0

Большое спасибо, я отлично понял ответ. Огромное спасибо. – benz

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