Конкатенация списков с двойной инициализацией
Я хотел бы объединить два списка массивов, как показано в ответе:
final List<String> l1 = Lists.newArrayList(...);
final List<String> l2 = Lists.newArrayList(...);
List<String> l = new ArrayList<String>() { { addAll(l1); addAll(l2); } };
Есть ли какая-то нестандартная причина, по которой я не должен использовать это таким образом?
2 ответа
Если вы уже используете Guava, вы можете сделать это, используя следующую строку:
List<String> l = FluentIterable.from(l1).append(l2).copyInto(new ArrayList<String>());
Я лично не люблю двойные скобки. Это создает новый класс только для того, чтобы инициализировать его другим способом. Новый класс означает больший целевой jar-файл, больше памяти требуется JVM для хранения классов, большую таблицу наследования для JIT-компилятора и т. Д. Это может стать значительным, если вы будете использовать такой подход везде. Если вы вернете это ArrayList
к другому компоненту, и ваш текущий компонент больше не используется (например, вы используете OSGi или другую модульную систему), у вас может быть зависание ClassLoader
который связан только с этим анонимным классом. Также, если вы заботитесь о сериализации, вы должны объявить serialVersionID
в этом новом классе. Даже если вам все равно, у вас может быть предупреждение об этом.
Ну, во-первых, это зависит от того, что вы хотите сделать с дублирующимися элементами. Этот код будет хранить любые дубликаты (например, если l1
а также l2
оба содержат "someString"
, l
будет содержать два "someString"
), так что это не совсем операция объединения. Называя это объединение двух списков было бы более точным.
Помимо этого, использование "двойной скобки" фактически создает экземпляр анонимного класса, который расширяет ArrayList. Я думаю, что это плохой стиль кода.
List<String> l = new ArrayList<String>(l1);
l.addAll(l2);
понятнее и не дольше писать.