Java 클래스 용 인터페이스가 선호되는 이유는 무엇입니까?
PMD 는 다음에 대한 위반을보고합니다.
ArrayList<Object> list = new ArrayList<Object>();
위반은 " 'ArrayList'와 같은 구현 유형을 사용하지 말고 대신 인터페이스를 사용하십시오."입니다.
다음 줄은 위반을 수정합니다.
List<Object> list = new ArrayList<Object>();
List
대신 후자를 사용해야하는 이유는 무엇 ArrayList
입니까?
구체적인 유형에 대한 인터페이스를 사용하는 것은 좋은 캡슐화와 코드의 느슨한 결합을위한 핵심입니다.
자체 API를 작성할 때이 관행을 따르는 것도 좋은 생각입니다. 그렇게하면 나중에 코드에 단위 테스트를 추가하고 (Mock 기술을 사용하여) 나중에 필요한 경우 기본 구현을 변경하는 것이 더 쉽다는 것을 나중에 알게 될 것입니다.
주제에 대한 좋은 기사 가 있습니다.
도움이 되었기를 바랍니다.
이는 목록 구현에서 코드를 분리하기 때문에 선호됩니다. 인터페이스를 사용하면 List에 정의 된 메서드 만 사용하는 한 나머지 코드를 변경하지 않고도이 경우 ArrayList 구현을 다른 목록 구현으로 쉽게 변경할 수 있습니다.
일반적으로 구현에서 인터페이스를 분리하는 것이 좋은 것이며 코드를 유지하기 쉽게 만드는 데 동의합니다.
그러나 고려해야 할 예외가 있습니다. 인터페이스를 통해 객체에 액세스하면 코드를 더 느리게 만드는 추가적인 간접 계층이 추가됩니다.
관심을 끌기 위해 1 백만 길이의 ArrayList에 대해 100 억 개의 순차적 액세스를 생성하는 실험을 실행했습니다. 2.4Ghz MacBook에서 List 인터페이스를 통해 ArrayList에 액세스하는 데 평균 2.10 초가 걸렸고, ArrayList 유형을 선언 할 때 평균 1.67 초가 걸렸습니다.
큰 목록, 내부 루프 내부 또는 자주 호출되는 함수로 작업하는 경우 고려해야 할 사항입니다.
ArrayList 및 LinkedList는 정렬 된 항목 컬렉션 인 List의 두 가지 구현입니다. 논리적으로는 ArrayList 또는 LinkedList를 사용하는지 여부는 중요하지 않으므로 유형을 제한하지 않아야합니다.
이것은 서로 다른 것들 인 Collection과 List와 대조됩니다 (List는 정렬을 의미하고 Collection은 그렇지 않습니다).
ArrayList 대신 List와 함께 후자를 사용해야하는 이유는 무엇입니까?
좋은 습관 : 구현보다는 인터페이스에 대한 프로그램
대체함으로써 ArrayList
와 함께 List
, 당신은 변경할 수 있습니다 List
귀하의 비즈니스 사용 사례에 따라 다음과 같이 미래에 구현.
List<Object> list = new LinkedList<Object>();
/* Doubly-linked list implementation of the List and Deque interfaces.
Implements all optional list operations, and permits all elements (including null).*/
또는
List<Object> list = new CopyOnWriteArrayList<Object>();
/* A thread-safe variant of ArrayList in which all mutative operations
(add, set, and so on) are implemented by making a fresh copy of the underlying array.*/
또는
List<Object> list = new Stack<Object>();
/* The Stack class represents a last-in-first-out (LIFO) stack of objects.*/
또는
다른 List
특정 구현.
List
인터페이스는 계약을 정의하고 특정 구현을 List
변경할 수 있습니다. 이러한 방식으로 인터페이스와 구현이 느슨하게 결합됩니다.
관련 SE 질문 :
지역 변수의 경우에도 구체적인 클래스에 대한 인터페이스를 사용하면 도움이됩니다. 인터페이스 외부에있는 메서드를 호출하게 될 수 있으며 필요한 경우 List 구현을 변경하기가 어렵습니다. 또한 선언에서 최소한의 특정 클래스 또는 인터페이스를 사용하는 것이 가장 좋습니다. 요소 순서가 중요하지 않으면 목록 대신 컬렉션을 사용하십시오. 이는 코드에 최대한의 유연성을 제공합니다.
클래스 / 인터페이스의 속성은 구현에 관계없이 사용할 동작 계약을 클래스에 제공하므로 인터페이스를 통해 노출되어야합니다.
하나...
지역 변수 선언에서는 다음과 같이하는 것이 거의 의미가 없습니다.
public void someMethod() {
List theList = new ArrayList();
//do stuff with the list
}
지역 변수 인 경우 유형을 사용하십시오. 여전히 적절한 인터페이스로 암시 적으로 업 캐스팅 가능하며 메서드는 인수에 대한 인터페이스 유형을 허용해야하지만 로컬 변수의 경우 구현이 필요한 경우 구현 유형을 컨테이너로 사용하는 것이 합리적입니다. 특정 기능.
일반적으로 코드 라인에 대해 인터페이스를 귀찮게하는 것은 의미가 없습니다. 그러나 우리가 API에 대해 이야기하고 있다면 정말 좋은 이유가 있습니다. 나는 소규모 수업을 받았습니다
class Counter {
static int sizeOf(List<?> items) {
return items.size();
}
}
이 경우 인터페이스 사용이 필요합니다. 내 사용자 정의를 포함하여 가능한 모든 구현의 크기를 계산하고 싶기 때문 입니다. class MyList extends AbstractList<String>...
.
참고 URL : https://stackoverflow.com/questions/147468/why-should-the-interface-for-a-java-class-be-preferred
'Development Tip' 카테고리의 다른 글
메모장 ++에서 regexp 캡처 그룹을 바꾸시겠습니까? (0) | 2020.10.29 |
---|---|
기능적 상태 비 저장 구성 요소의 PropTypes (0) | 2020.10.29 |
BackgroundWorker의 처리되지 않은 예외 (0) | 2020.10.29 |
들어오는 모든 http 요청을 어떻게 모니터링합니까? (0) | 2020.10.29 |
Objective-C에서 nil 테스트 — if (x! = nil) 대 if (x) (0) | 2020.10.29 |