Java의 Collections.singletonList ()를 사용합니까?


164

Collections.singletonList()Java에서 무엇을 사용 합니까? 하나의 요소가있는 목록을 반환한다는 것을 알고 있습니다. 왜 별도의 방법을 사용하고 싶습니까? 불변성은 여기서 어떤 역할을합니까?

편리한 방법이 아니라이 방법에 대한 유용한 유용한 사용 사례가 있습니까?


6
여기에 유용하게 사용될 수있는 방법의 예입니다 - stackoverflow.com/a/1239631/360811
shabunc


1
@sschuberth, 질문 날짜를 비교하십시오. OP는 미래의 질문을 복제 할 수 있음을 알지
못했음

사실, @KumarAnkit이지만 중복에 대한 링크는 대안 / 잠재적으로 더 나은 답변을 찾는 사람들에게 여전히 유용합니다. 사실 중복으로 연결하는 것은 양방향으로 간주해야하며 더 오래된 질문이든 새로운 질문이든 더 나은 질문 / 답변을 유지해야한다고 생각합니다.
sschuberth

@ sschuberth, 좋은 지적이지만 여기 에이 질문과 비슷한 것으로 분류해야합니다.
KumarAnkit

답변:


159

javadoc에서는 이 말한다 :

"지정된 개체 만 포함하는 변경 불가능한 목록을 반환합니다. 반환 된 목록은 직렬화 가능합니다."

물어:

왜 별도의 방법을 사용하고 싶습니까?

주로 편의상 ... 명령문을 다음과 같이 작성하지 않아도됩니다.

  • 빈리스트 객체를 생성
  • 요소를 추가하고
  • 불변 래퍼로 포장하십시오.

또한 조금 더 빠르거나 메모리를 절약 할 수 있지만 이러한 작은 절약 효과는 크지 않을 것입니다. (많은 수의 싱글 톤 목록을 만드는 응용 프로그램은 가장 드물게 들립니다.)

불변성은 여기서 어떤 역할을합니까?

이 방법의 사양 중 일부입니다. 위 참조.

편리한 방법이 아니라이 방법에 대한 유용한 유용한 사용 사례가 있습니까?

singletonList방법 을 사용하는 것이 편리한 사용 사례가 있습니다 . 그러나 나는 일반적인 유스 케이스와 "특히 유용한"케이스를 (객관적으로) 구별하는 방법을 모른다.


26

싱글 톤 메소드에 대한 하나의 보기 가 있습니다.

이러한 다양한 "단일"메소드가 단일 값을 해당 값의 콜렉션이 필요한 API에 전달하는 데 유용하다는 것을 알았습니다. 물론 이것은 전달 된 값을 처리하는 코드가 컬렉션에 추가 할 필요가 없을 때 가장 효과적입니다.


위 의견의이 부분을 이해하도록 도와 줄 수 있습니까? "물론 전달 된 값을 처리하는 코드가 컬렉션에 추가 할 필요가 없을 때 가장 효과적입니다." 나는 그것을 얻지 못했습니다.
Bilbo Baggins

2
전달 된 목록은 변경할 수 없기 때문에 전달 된 목록을 수정할 수 없다고 말합니다.
Daniel Higueras

2
@BilboBaggins-그 말은 아이러니했습니다. :-) "이것은 ... 일 때 가장 잘 작동합니다."라는 문구가 더 정확하게 쓰여집니다.
Stephen C

18

javadoc에서

@param  the sole object to be stored in the returned list.
@return an immutable list containing only the specified object.

import java.util.*;

public class HelloWorld {
    public static void main(String args[]) {
        // create an array of string objs
        String initList[] = { "One", "Two", "Four", "One",};

        // create one list
        List list = new ArrayList(Arrays.asList(initList));

        System.out.println("List value before: "+list);

        // create singleton list
        list = Collections.singletonList("OnlyOneElement");
        list.add("five"); //throws UnsupportedOperationException
        System.out.println("List value after: "+list);
    }
}

코드가 읽기 전용 목록을 기대하지만 하나의 요소 만 전달하려는 경우에 사용하십시오. singletonList(스레드) 안전하고 빠릅니다.


고마워, 이것이 더 나은 대답입니다. 당신은 단순히 "유스 케이스가 있지만 분명히 모르겠습니다"라고 말하는 대신에 예를 들었습니다.
프로그래머

3

불변의 질문에 대답하려면 :

Collections.singletonList불변의리스트를 작성합니다. 변경할 수없는 목록 (변경 불가능한 목록이라고도 함)은 내용을 변경할 수 없습니다. 내용을 변경하려고하면 항목을 추가하거나 제거하는 방법에서 예외가 발생합니다.

단일 목록에는 해당 항목 만 포함되어 있으며 변경할 수 없습니다.


2

Immutable / Singleton 콜렉션이 하나의 오브젝트 만 가지고 있고 더 이상 수정되지 않는 콜렉션을 참조하는 경우, 하나의 오브젝트 만 갖는 콜렉션 "UnmodifiableCollection"을 작성하여 동일한 기능을 수행 할 수 있습니다. Unmodifiable Collection을 통해 하나의 객체로 동일한 기능을 수행 할 수 있기 때문에 Singleton Collection은 어떤 특별한 용도로 사용됩니까?


하나의 객체로 "정상적인"방식으로 싱글 톤 메소드를 사용하여 수정 불가능한 콜렉션을 작성하십시오. 그렇다면 왜 그런지 즉시 알 수 있습니다.
kap

1

singletonList는 모든 객체의 인스턴스를 보유 할 수 있습니다. 객체 상태를 수정할 수 있습니다.

List<Character> list = new ArrayList<Character>();
list.add('X');
list.add('Y');
System.out.println("Initial list: "+ list);
List<List<Character>> list2 = Collections.singletonList(list);
list.add('Z');
System.out.println(list);
System.out.println(list2);

위와 같이 unmodifiableList를 정의 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.