programing

다형성:"ArrayList list = new ArrayList" 대신 "List list = new ArrayList"를 사용하는 이유는 무엇입니까?

shortcode 2022. 7. 19. 21:46
반응형

다형성:"ArrayList list = new ArrayList" 대신 "List list = new ArrayList"를 사용하는 이유는 무엇입니까?

중복 가능성:
Java 클래스의 인터페이스가 우선되는 이유는 무엇입니까?

언제 사용하면 좋을까요?

List<Object> list = new ArrayList<Object>();

ArrayList 계승하다List의 일부 이 있는ArrayListList, 저는 , , , , , , , , , , , , , , , , , , , , ,의 특징을 잃게 ArrayList를 발견하게 거죠?컴파일러는 이러한 메서드에 액세스하려고 할 때 오류를 인식합니까?

이렇게 하는 주된 이유는 특정 인터페이스 구현에서 코드를 분리하기 위해서입니다.코드를 다음과 같이 쓸 경우:

List list = new ArrayList();  

코드에서는 가 "만 알 수 있습니다.List은 '다행하다'의 할 수 있기 List쉽게 조작할 수 있습니다.

큰 서드파티 가정하고, 해 봅시다.LinkedList가 이들에 크게 알 수 는 이 리스트의 요소를 것을 알게 될 ArrayList, 「O(1)」가 「O(1의 액세스 시간이 ).LinkedList(O(n)는, O(n)은, O(n)는, O(n)는, 「O(n)」의 약칭입니다.인터페이스에 프로그래밍을 하고 있는 경우, 이러한 변경은 간단합니다..List 송신원,

List list = new LinkedList();

로.

List list = new ArrayList();  

이가 있을 알 수 있습니다. 왜냐하면 입니다. 왜냐하면 당신은 당신의 코드를 써서 계약서에 의해 제공된 계약서를 따르도록 했기 때문입니다.List인터페이스입니다.

를 「」, 「」를 사용해 실장하고 있는 는,LinkedList list = new LinkedList()'비밀번호'에 해당하는 않을 것입니다 왜냐하면 코드의 나머지 부분이 특정 방법을 사용하지 않는다는 보장이 없기 때문입니다.LinkedList를 누릅니다

결국 선택은 단순히 디자인의 문제일 뿐인데...그러나 이러한 설계는 (특히 대규모 프로젝트에서 작업할 때) 매우 중요합니다.이는 기존 코드를 깨지 않고 나중에 구현별 변경을 수행할 수 있기 때문입니다.

이를 인터페이스 프로그래밍이라고 합니다.이것은 향후 List의 다른 구현으로 이행하고 싶은 경우에 도움이 됩니다.에서 몇 을 사용하고 ArrayList그 후, 다음과 같은 실장에 맞추어 프로그램 할 필요가 있습니다.ArrayList a = new ArrayList().

이것은 퍼블릭인터페이스를 공개하는 경우에도 도움이 됩니다.이런 방법이 있다면

public ArrayList getList();

그리고 나서 당신은 그것을 바꾸기로 결정했다.

public LinkedList getList();

하고 있는 사람ArrayList list = yourClass.getList()코드를 변경해야 합니다.반면에, 만약 그렇게 한다면,

public List getList();

구현을 변경해도 API 사용자는 변경되지 않습니다.

@tsatiz의 답변은 대부분 옳다고 생각합니다(실장보다는 인터페이스에 프로그래밍).다만, 인터페이스에 프로그래밍 하는 것으로, 어떠한 기능도 없어지지 않습니다.제가 설명해 드릴게요.

변수를 선언한 경우List<type> list = new ArrayList<type>실제로 ArrayList의 기능은 손실되지 않습니다.네가 해야 할 일은 그저 네가 해야 할 일은list까지ArrayList다음은 예를 제시하겠습니다.

List<String> list = new ArrayList<String>();
((ArrayList<String>) list).ensureCapacity(19);

Array List에 캐스트하면 인터페이스에 코딩할 필요가 없어지기 때문에 궁극적으로 tsatiz가 옳다고 생각합니다.단, 처음에 인터페이스를 코드화하고 나중에 필요할 경우 구현에 코드를 지정하는 것이 좋습니다.

도움이 됐으면 좋겠네요!

이를 통해 다음과 같은 내용을 쓸 수 있습니다.

void doSomething() {
    List<String>list = new ArrayList<String>();
    //do something
}

나중에 다음과 같이 변경할 수 있습니다.

void doSomething() {
    List<String>list = new LinkedList<String>();
    //do something
}

다른 방법을 바꾸지 않아도 됩니다.

단, 를 사용하고 싶은 경우CopyOnWriteArrayList예를 들어 추가 메서드(addIfAbsent 등)를 사용하는 경우 리스트가 아닌 리스트로 선언해야 합니다.

void doSomething() {
    CopyOnWriteArrayList<String>list = new CopyOnWriteArrayList<String>();
    //do something, for example:
    list.addIfAbsent("abc");
}

제 생각에 당신의 질문의 핵심은 왜 하냐는 것 같아요.program to an interface, not to an implementation

단순히 인터페이스를 통해 보다 추상적이고 유연한 코드와 변경에 대한 복원력을 얻을 수 있습니다.이 경우 클라이언트를 변경하지 않고 동일한 인터페이스의 다른 구현을 사용할 수 있기 때문입니다(이 경우 List 구현을 ArrayList가 아닌 linkedList로 변경할 수 있습니다).

나는 그 문제를 복잡하게 만들고 싶지 않을 때 그 방법을 사용한다.이것은 리스트일 뿐, 어떤 종류의 리스트인지는 말할 필요도 없습니다.문제와는 무관합니다.대부분의 솔루션에서 Collection을 사용하는 경우가 많습니다.결국 나머지 소프트웨어에서는 Collection이 보유하고 있는 콘텐츠가 가장 중요하기 때문에 Collection에 새로운 개체를 추가하고 싶지 않습니다.

또, 사용하고 있는 리스트의 임프레멘테이션을 변경하고 싶다고 생각할 때, 그 구조를 사용합니다.예를 들어 ArrayList와 함께 구성을 사용하고 있으며 문제가 스레드 세이프가 아니라고 가정합니다.이제 스레드를 안전하게 만들고 싶을 때 솔루션의 일부에 대해 벡터를 사용하도록 변경합니다.이 리스트의 다른 용도는 Arary List든 Vector든 상관없습니다.그냥 리스트이기 때문에 새로운 수정은 필요 없습니다.

일반적으로 인터페이스에 대해 프로그래밍합니다.이것에 의해, 실장을 언제라도 교환할 수 있습니다.이는 특히 모르는 구현에 합격했을 때 유용합니다.

그러나 구체적인 구현을 선호하는 상황이 있습니다.예를 들어 GWT에서 serialize 하는 경우.

언급URL : https://stackoverflow.com/questions/9852831/polymorphism-why-use-list-list-new-arraylist-instead-of-arraylist-list-n

반응형