2012-08-11 5 views
1

, 나는 종종이를 참조하십시오실제 클래스보다 인터페이스를 선언하고 싶습니다. 예를 들어

Set<Integer> s = new TreeSet<Integer>(); 
Set<Integer> s = new HashSet<Integer>(); 
Map<Integer, String> m = new HashMap<Integer, String>(); 

TreeSet<Integer> ts = new TreeSet<Integer>(); 
HashSet<Integer> hs = new HashSet<Integer>(); 
HashMap<Integer, String> hm = new HashMap<Integer, String>(); 

을 통해 무엇 장점/후자 대 전자의 disadvanges?

+0

http://stackoverflow.com/questions/2026054/why-do-we-use-interface-is-it-only-for-standardization – Jayan

+1

사실, 이것은 훨씬 더 유사합니다 : http://stackoverflow.com/z/1484445/why-are-variables-with-the-interface-name-in-java? rq = 1 – Zong

+0

@ Zong Li : 네, 실제로 이것은 중복되었습니다. – Jayan

답변

2

나를 위해 그것은 많은 점에 이른다.

구현에 신경 씁니까? 코드에서 MapHashMap 또는 TreeMap임을 알아야합니까? 또는 어떤 종류의 키/값 구조를 가지고 있다는 것을 신경 써야합니까?

또한 구현 코드를 작성할 때 Map을 반환하는 메서드가 공개 될 경우이 코드를 사용하지 않고 시간에 따라 구현을 변경할 수 있습니다. 그것에 의존하는 코드

다른 (이 값의 이러한 유형을 시도하고 캐스팅 나쁜 생각이 이유 때문에 이유)를 초래하는 것은, 코드 주위에 수 있도록 모든 방법을 이러한 구조를 이동하기 쉬워진다이다 받아들이는 Map 예를 들어 HashMap에 의존하는 것이 더 쉬울 것입니다.

규칙 (제가 따르는)은 기본적으로 t입니다 o API의 필요성을 충족시키는 가장 기능적인 인터페이스를 사용하십시오. (당신이 SortedMap을 필요로하는 경우, 아무 소용이 Map 다음 사용하지 않는, 예를 들어) 기능 귀하의 API 요구 사항을 제공하지 않습니다 인터페이스 이럴

일반적으로

1

를 사용하여 어떤 점은, 당신은 가장 일반적인 유형을 선언하고 싶지 당신이 실제로 사용하고있는 행동이 있습니다. 그렇게하면 다른 구체적인 수업을 듣기로 결정할 때 많은 코드를 변경할 필요가 없습니다. 그리고 사용자는 기능을 더 자유롭게 사용할 수 있습니다.

1

당신은 On Understanding Data Abstraction, RevisitedProposal for Simplified, Modern Definitions of "Object" and "Object Oriented" 자신도 William R. Cook에 의해 읽어야합니다.

는 Bascially : 당신은 클래스 이름이있는 경우 즉 공장보다는 다른 것, 자바 클래스를 사용하면 어디서나 당신이 객체 지향 프로그래밍을하지 말자고하는 new 운영자 후 기대합니다. 이 규칙을 따른다고해서 OO를한다는 것을 보장하는 것은 아니지만이 규칙을 위반한다고해서 OO가 아니라는 것을 의미합니다.

참고 : OO를 수행하지 않는 것은 아무 문제가 없습니다.

0

응용 프로그램의 유지 관리 비용은 개발 기간의 3 배입니다. 즉, 코드를 가능한 간단하고 명확하게 작성해야합니다.

ArrayList 대신 List를 사용하는 경우 ArrayList에 특별한 메서드를 사용하지 않고 다른 List 구현에서 변경할 수 있다는 것을 명확히합니다. ArrayList를 사용할 필요가 없을 때 ArrayList를 사용할 때의 문제점은 실제로 List 일 수 있다고 판단하는 데 오랜 시간이 걸린다는 것입니다. 즉 뭔가를 필요로하지 않았다는 것을 증명하기가 매우 어렵습니다. (제거하는 것보다 항목을 추가하는 것이 상대적으로 쉽습니다.)

비슷한 예제는 List가 수행 할 때 Vector를 사용하는 것입니다. 당신이 말하는 벡터를 보았다면; 개발자가 좋은 이유로 Vector를 선택하면 스레드로부터 안전합니다. 하지만 지금 코드를 변경하고 코드가 스레드로부터 안전한지 확인해야합니다.그들은 말하지만 멀티 스레드 방식으로 사용되는 방식을 볼 수 없으므로 사용 가능한 모든 방법을 확인하거나 실제로 반복 할 필요가 없을 때 동기화 할 때 동기화를 추가해야합니다 스레드로부터 안전합니다. 스레드 세이프 콜렉션을 사용할 필요가없는 경우에는 CPU 시간 낭비뿐만 아니라 개발자의 시간 낭비가 중요합니다.