2016-09-17 1 views
0

У меня есть фабричный метод боксировать некоторые зависящими от порядка вещей:Функция, которую я хочу использовать Spring-injection, принимает varargs. Должен ли я предоставить перегрузку вместо списка?

import com.google.common.collect.ImmutableList; 
import com.google.common.collect.Lists; 

public class ThingBoxProcessor { 
    public static ThingBox forInputThings(Thing... thingsToProcess) { 
     ThingBox thingBox = new ThingBox(); 
     for (Thing thing : Lists.reverse(ImmutableList.copyOf(thingsToProcess))) { 
      thingBox.store(thing); 
     } 
     return thingBox; 
    } 
} 

И я инъекционное это как так:

<bean name="Things" class="ThingBoxProcessor" factory-method="forInputThings"> 
    <constructor-arg> 
     <list> 
     <ref bean="ThingTwo" /> 
     <ref bean="ThingOne" /> 
     <!-- imagine a couple dozen other things that do different order-sensitive things --> 
     </list> 
    </constructor-arg> 
</bean> 

весна Создание ArrayList, а затем преобразовать его в массив? . Есть ли существенное преимущество в производительности предлагая перегрузки, такие как:

public static ThingBox forInputThings(Thing... thingsToProcess) { 
     return forInputThings(ImmutableList.copyOf(thingsToProcess)); 
    } 

    public static ThingBox forInputThings(List<Thing> thingsToProcess) { 
     ThingBox thingBox = new ThingBox(); 
     for (Thing thing : Lists.reverse(thingsToProcess)) { 
      thingBox.store(thing); 
     } 
     return thingBox; 
    } 

(This question это не то, что я заинтересован в Я знаю, что может вводить список весной XML в переменных аргументах пары, я просто хотим знать, если есть причины производительности сделать иначе)

+1

Для чего это весна, Spring выбирает версию, которая принимает список над тем, который принимает varargs, в моем тестировании. Мое личное предпочтение - предпочитать более чистый, менее запутанный API (т. Е. Только одну функцию) и беспокоиться только об эффективности, если профилирование идентифицирует его как проблему. – jkade

+0

Это вопрос стиля; второй явно избегает создания этой неизменной копии, которая сразу же выбрасывается. – GhostCat

ответ

1

я не посвящаю в любое время к этой проблеме, потому что:.

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

Плюс: запуск контекста Spring займет не менее нескольких секунд, поскольку ему необходимо прочитать файлы конфигурации, классы загрузки и т. Д. По сравнению с этим штраф за преобразование между массивами и списками любого разумного размера (разумный в некотором смысле, что вы, вероятно, не поставили бы более 50? ваших параметров в Spring), , скорее всего, добавит около 0,000001% к вашей загрузочной скорости.

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

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