2012-10-06 6 views
1

누군가 다음 코드를 설명 할 수 있습니까? 왜 "List"와 "ArrayList"는 이 아닌가? 변수 neighborColumns가 유형 Column 객체를 보유하는 List 데이터 구조이지만 변수 neighborColumns에서 List 클래스의 공용 메소드 만 사용할 수 있습니까? 미리 감사드립니다. ArrayList 해당 인터페이스를 구현하는 특정 클래스 동안Java List 및 ArrayList 선언

List<Column> neighborColumns = new ArrayList<Column>(); 

답변

3

이 코드는 괜찮 (디자인) (목록 인터페이스하기 .

- : 클래스를 구현

을 장점은, 당신이 코드 아래

문제 구현 (ArrayList를로 (디자인)입니다 .. 디자인을 변경하지 않고, 다양한 구현 사이를 전환 할 수 있다는 것입니다 여기에
ArrayList<Column> neighborColumns = new ArrayList<Column>(); 

//OOPs.. Cry (Incompatible Types) 
ArrayList<Column> neighborColumns = new LinkedList<Column>(); 

당신이 .. 구현에 설계하고 그래서 당신은 또한 일반적으로, 그래서

.. 컴파일러는 위와 같이 울 것 있습니다 .. RHS에 구현을 변경할 수 없기 때문에, 당신은 항상 설계해야 인터페이스에 따라서 구현을 노출시키지 않고 언제든지 구현을 변경할 수있는 유연성을 얻을 수 있습니다.

+0

구현을 변경한다고하면이 경우 ArrayList 또는 concrete 클래스에 새 메서드를 추가 할 수 있습니다. 나는 너를 완전히 오해하고 있니? –

+0

@ 12345 .. 구현 방법을 변경하지 않아도 목록 포인트를 다른 클래스 개체로 만듭니다. –

+0

그러면 다음과 같이 변경할 수 있습니까? –

1

List는 인터페이스이다.

가능한 경우 특정 클래스가 아닌 인터페이스를 프로그래밍하는 것이 좋습니다. 다른 목록 구현을 나중에 쉽게 사용하도록 변경하기 쉽기 때문입니다. 위의 코드에서

List<Column> neighborColumns = new ArrayList<Column>(); 
List<Column> neighborColumns = new LinkedList<Column>(); // OK To change.. 

, 당신은 기본적으로 오히려 implementation..List보다 인터페이스로 디자인하는 인터페이스이며, ArrayList를 콘크리트입니다 -이 :