Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SpringMVC
- list
- traceId
- java.util.list
- asynccustomautoconfiguration
- java lambda
- java list
- elasticsearch
- kotlin
- traceasynccustomautoconfiguration
- b3-propagation
- micrometer tracing
- jpa
- map
- asyncconfigurer
- EnableWebMvc
- spring3 spring2 traceid
- aws secretmanager
- CompletableFuture
- Spring Boot
- java
- Spring JPA
- DeferredImportSelector
- spring
- Sleuth
- HashMap
- ResponseBody
- awssecretsmanagerpropertysources
- spring MVC
- @FunctionalInterface
Archives
- Today
- Total
du.study기록공간
Arrays.asList List에 add를 했더니 UnsupportedOperationException 를 만났을 때 본문
728x90
코드리뷰를 하던도중 간단하면서도 실수하기 좋은 부분을 기록하고 넘어가고자 합니다.
Arrays.asList 나 Collections.singletonList 등을 이용하여 List를 생성하는 경우를 종종 보고있는데요
이번엔 Arrays.asList를 사용해서 add를 하는경우에 발생하는 에러를 기록하고 넘어가고자 합니다.
예시코드는 아래와 같습니다.
List<String> list = Arrays.asList("A","B");
list.add("C");
System.out.println(list);
이 경우 [A, B, C] 가 출력될거라 생각할 수 있지만, 결과는 아래 에러를 맞이하게 됩니다. java.lang.UnsupportedOperationException
왜 그럴까? 를 확인하기위해 Arrays.asList 내부를 보았습니다.
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
Arrays.asList 내부에서 ArrayList 클레스를 따로 정의하고있고, 이를 사용하고있습니다.
하지만 List에 매핑이 되니까 결국 add를 구현했겠지 하여 찾아봤더니 AbstractList 안의 add구현체에서 답을 찾았습니다.
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
java.util.Arrays 안에있는 ArrayList 는 별도의 add를 구현하지 않기에 add는 exception으로 이어집니다.
java.util.Arrays 클레스의 주석을 읽다보면, 해당 클레스는 불변의 컬렉션을 생성하기 위한 용도로 추측이 됩니다.
외전으로 Collections.singletonList 는 add같은 기능이 있을까 (이름부터 당연히 없어야함이 느껴지지만) 해서 한번 찾아본 코드입니다.
동일하게 add는 구현되어있지 않은걸 볼 수 있습니다.
public static <T> List<T> singletonList(T o) {
return new SingletonList<>(o);
}
/**
* @serial include
*/
private static class SingletonList<E>
extends AbstractList<E>
implements RandomAccess, Serializable {
private static final long serialVersionUID = 3093736618740652951L;
private final E element;
SingletonList(E obj) {element = obj;}
public Iterator<E> iterator() {
return singletonIterator(element);
}
public int size() {return 1;}
public boolean contains(Object obj) {return eq(obj, element);}
public E get(int index) {
if (index != 0)
throw new IndexOutOfBoundsException("Index: "+index+", Size: 1");
return element;
}
// Override default methods for Collection
@Override
public void forEach(Consumer<? super E> action) {
action.accept(element);
}
@Override
public boolean removeIf(Predicate<? super E> filter) {
throw new UnsupportedOperationException();
}
@Override
public void replaceAll(UnaryOperator<E> operator) {
throw new UnsupportedOperationException();
}
@Override
public void sort(Comparator<? super E> c) {
}
@Override
public Spliterator<E> spliterator() {
return singletonSpliterator(element);
}
}
728x90
'자바' 카테고리의 다른 글
Ehcache에서 만난 warning 'The JVM is preventing Ehcache from accessing the subgraph beneath ~ cache sizes may be underestimated as a result' (0) | 2023.03.28 |
---|---|
Sentry environment 설정방법 (0) | 2023.03.23 |
stream과 함께 CompletableFuture multi task join 하기 (3) | 2021.12.27 |
Java @FunctionalInterface - Function (0) | 2021.12.14 |
Java @FunctionalInterface - Consumer (0) | 2021.11.17 |
Comments