Иногда мне нужно возвращать пустые массивы для выполнения некоторых контрактов классов.
Вместо того, чтобы всегда создавать пустой массив:
@Override public String[] getDescriptionTexts() {
return new String[0]; // no texts
}
Я думаю, что лучше повторить использование пустого массива из константы:
public class Strings {
public static final String[] EMPTY_ARRAY = new String[0];
}
@Override public String[] getDescriptionTexts() {
return Strings.EMPTY_ARRAY; // no texts
}
Стоит ли такая оптимизация?
Они семантически эквивалентны, они читаются, но использование постоянного массива будет (очень немного) более эффективной и разумной.
Поэтому я бы просто пошел за константой.
Быстрый микро-тест показывает, что разница составляет около 1 процессорный цикл с точки зрения производительности (0,3 наносекунды, то есть ничего действительно) и что активность GC выше при создании пустого массива (~ 10 мс на 1000 мс тест или 1% времени в GC).
Benchmark Mode Samples Score Error Units
c.a.p.SO27167199.constant avgt 10 3.165 ± 0.026 ns/op
c.a.p.SO27167199.constant:@gc.count.profiled avgt 10 0.000 ± NaN counts
c.a.p.SO27167199.constant:@gc.count.total avgt 10 0.000 ± NaN counts
c.a.p.SO27167199.constant:@gc.time.profiled avgt 10 0.000 ± NaN ms
c.a.p.SO27167199.constant:@gc.time.total avgt 10 0.000 ± NaN ms
c.a.p.SO27167199.newArray avgt 10 3.405 ± 0.051 ns/op
c.a.p.SO27167199.newArray:@gc.count.profiled avgt 10 250.000 ± NaN counts
c.a.p.SO27167199.newArray:@gc.count.total avgt 10 268.000 ± NaN counts
c.a.p.SO27167199.newArray:@gc.time.profiled avgt 10 95.000 ± NaN ms
c.a.p.SO27167199.newArray:@gc.time.total avgt 10 108.000 ± NaN ms
Да, если вам нужно много раз использовать пустой массив или пустую строку в Java, использование константы - лучшая идея. Если вы используете одиночную статическую константу, она создаст только один объект в памяти мгновенного создания одного и того же объекта много раз.
Они не включили много вещей, которые могут быть полезны в JDK. Что относительно EMPTY_STRING
? Звучит очень полезно.
Я лично предпочитаю использовать ваш второй подход, то есть определить static final String[] EMPTY = new String[0]
а затем использовать его.