2012-05-18 2 views
1

"라일리 - 프로그래밍 안드로이드"그들은이 코드를 피하는 것이 좋습니다자바 좋은 연습 - 인터페이스 유형의 선언 대신 구현 유형의 선언에서

ArrayList<String> a = new ArrayList<String>(); 

하지만 그것을 대체 할 :

List<String> a = new ArrayList<String>(); 

그들은 나중에 a의 유형을 연결 목록을 말하도록 변경해야한다면 코드를 유지 관리하는 것이 더 쉽다고 주장합니다. 그렇다면 Collection 또는 심지어 Object 유형으로 만들지 않으시겠습니까?

유형을 변경하려면 인스턴스화를 변경해야하므로 최대한 제한된 유형으로 유지하고 필요할 경우 추가 행을 변경하는 것이 좋습니다.

맞습니까?

+0

다른 무엇보다 관습입니다. 그러나 대회가 중요합니다. –

+0

큰 프로젝트를 만들 때 훨씬 더 의미가 있습니다. 인터페이스를 사용하면 구현에 하드 코딩 한 것보다 격리 된 클래스를 테스트하는 것이 훨씬 쉽고 나중에 응용 프로그램 모듈을 훨씬 쉽게 업그레이드 할 수 있습니다. –

+1

농담해야합니다, @ TomHawtin-tackline. – alphazero

답변

0

가능한 한 인터페이스를 하이 (계층 구조)로 사용해야하며 필요한 작업이 있어야합니다.

개체를 저장하고 반복하고 색인을 사용하여 개체를 가져와야하는 경우가 있습니다. List 인터페이스가이를 제공합니다. Object는 이러한 메서드를 제공하지 않습니다.

Object을 사용하면 코드를 읽기 쉽게 만들고 예외를 캐스팅 할 수 있습니다.

0

Object 참조로 유용 할 수있는 것이 없으므로.

3

그들은 정확합니다.

가능한 가장 제한된 유형을 사용해야합니다. 또는 Set 대신 Collection이 올바른 추상화 인 경우 대신 사용하십시오. Object으로 사용해야하는 경우 반드시 Object으로 지칭하십시오. 그러나 좀 더 구체적으로 설명해야한다면 좀 더 구체적으로 설명하십시오. 그 트릭은 필요하지 않을 때 주조를 피하는 것입니다.

앞서 언급했듯이 구현 정보를 숨기지 않으려는 경우이를 숨기는 것이 좋습니다. 이렇게하면 소프트웨어를보다 사용하기 쉽고 유지 보수가 용이 해집니다. 예를 들어 List을 반환하는 메서드가있는 경우 소프트웨어를 사용하는 사람은 실제로 List의 구현에 대해 걱정할 필요가 없습니다. 이렇게하면 소프트웨어를 더 쉽게 이해할 수 있습니다. 이 때문에, 당신은 어떤 유형의 List을 무료로 반환 할 수 있습니다 (대부분의 경우) 그 방법을 호출하는 프로그램을 아프게합니다.

+0

'Set'을 많이 사용할 필요는 없겠지요? –

+0

@TomHawtin, 왜 안 되니? 'Set '은 중복 된 요소가없고 그 요소의 순서가 중요하지 않다는 것을 의미합니다. 그것들이 당신의 요구 사항이라면,'Collection'은 그 특성을 의미하지 않기 때문에'Set'이 최선의 선택입니다. 인터페이스에 정의 된 메소드가 중요하다는 것을 암시하는 것은 아닙니다. – Jeremy

+0

그러나'List'에 대해서'ArrayList'도 마찬가지입니다. –

1

그들은 잘못되었습니다.

형식이 공용 API에 표시되는 경우 의미가 허용하는 것처럼 일반 형식이어야합니다.

List<String> getStringList(); 

구현 세부 사항으로, 유형은 프로그래머가 알고있는만큼 구체적이어야합니다.

ArrayList<String> stringList = new ArrayList<>(); 
+1

왜 그렇게 생각하니? – mjfgates

+0

동의하지 않습니다. 필요한 모든 것이 인터페이스의 메소드라면 인터페이스에 코딩해야합니다. 공용 인터페이스에서 사용할 수없는 동일한 범위에서 무언가를 조정해야하는 경우에만 구현을 사용할 수 있습니다 (ArrayList의 경우 거의 모든 액세스 가능한 메서드가 공용 인터페이스에도 있음). –

관련 문제