У меня есть фабричный метод боксировать некоторые зависящими от порядка вещей:Функция, которую я хочу использовать 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 в переменных аргументах пары, я просто хотим знать, если есть причины производительности сделать иначе)
Для чего это весна, Spring выбирает версию, которая принимает список над тем, который принимает varargs, в моем тестировании. Мое личное предпочтение - предпочитать более чистый, менее запутанный API (т. Е. Только одну функцию) и беспокоиться только об эффективности, если профилирование идентифицирует его как проблему. – jkade
Это вопрос стиля; второй явно избегает создания этой неизменной копии, которая сразу же выбрасывается. – GhostCat