2011-09-03 2 views
2
List<String> someName = new ArrayList<String>(); 

ArrayList<String> someName = new ArrayList<String>(); 
  1. 성능에 영향을 줍니까?
  2. 첫 번째 것은 객체 목록이고 두 번째 객체는 객체의 ArrayList입니다. 내가 틀렸다면 나를 바로 잡아라. ArrayList는 List Interface를 구현하기 때문에 혼란 스럽다.
  3. 사람들이 왜 이것을 선언합니까? 어떤 종교든지 도움이됩니까?
  4. DB에서 일부 이메일 주소를 수신 할 때 수집하는 가장 좋은 방법은 무엇입니까? 이메일 주소 개체 목록 ????
  5. 마지막으로 하나의 관련이없는 질문 .... 인터페이스에는 동일한 이름과 서명 및 동일한 이름을 가진 두 개의 메소드 이름이 서로 다른 서명을 가질 수 있습니다.
+1

코드 샘플에서 두 개의 다른 변수 이름을 사용했다면 좋은 질문 집합이지만 명확하게 대답하기가 쉽습니다. – Uffe

답변

6

선언의 차이점은 스타일 중 하나입니다. 변수 유형을 변경하지 않고 나중에 구현 선택을 변경할 수 있으므로 구체적인 구현보다는 추상을 사용하여 변수를 선언하는 것이 바람직합니다. 예를 들어 LinkedList를 대신 사용하도록 List를 변경할 수 있습니다.

특히 메소드 시그니처에서 추상 유형 (인터페이스 또는 추상 클래스)을 사용할 수있는 경우 클라이언트 코드는 선호하는 구현을 자유롭게 사용할 수 있습니다. 따라서 코드를보다 유연하고 쉽게 유지할 수 있습니다.

이것은 변수 선언에서도 마찬가지입니다. 이것을 고려하십시오 :

public abstract class MyListUsingClass { 

    private List<String> list; 

    protected MyListUsingClass(List<String> list) { 
     this.list = list; 
    } 

    ... 
} 

을 변수 list가 다음 ArrayList로 선언 된 ArrayLists이 생성자으로 인정 될 경우. 이는 좋지 않은 선택입니다. 항상 클라이언트 코드가 사용하려는 구현을 선택하도록하십시오.

마지막 질문 : 인터페이스에는 클래스와 동일한 메소드 제한이 있으므로 예 : overload methods 수 있습니다.

1
  1. 성능 - 아마도 그렇지 않습니다.
  2. 사실 그들은 개체가 아닌 문자열 목록입니다. 인터페이스가 콜렉션에있는 포인트가 아닙니다.
  3. 수퍼 클래스 유형의 변수 정의는 코드를 구체적인 목록 구현과 독립적으로 만들 때 유용 할 수 있습니다. 당신이 LinkedList 구현 목록을 변경하려면 언젠가는 경우 -이
  4. 는 새로운 형태의 이메일을 작성하고 목록의 일종으로 저장할 모든 코드에 매우 해로운되지 않습니다하거나 배열 (이메일 (예 : LinkedList 또는 ArrayList 언급) []). 더 많은 정보를 제공하면 도움이 될 수 있습니다. 그들이 문자열의 ArrayList를 둘 경우

편집 2. 차이점은 첫 번째 경우에는 수퍼 클래스로 캐스팅하는 것입니다 (ArrayList과 관련된 일부 메서드에 대한 액세스 권한을 잃어 버림)

+0

문자열 *은 * 개체입니다. –

+2

@Martijn : 그러나'List '도'List '이 아닙니다. –

+0

@Cameron : 사실입니다. –

1

첫 번째 원인은 var 유형의 목록을 선언하고 해당 구현으로 ArrayList를 사용하고 있기 때문입니다 .

두 번째 경우에는 배열 목록을 선언하고 정의합니다.

의 차이는 ArrayList 일부 특정 구현 방법이있는 경우 (첫 번째 경우와 같이)를 interface 유형을 사용하여, 당신은 당신이 필요합니다에 액세스하기 위해, List 인터페이스에 정의 만의 방법을 액세스하고 것이다 목록을 해당 하위 유형 (ArrayList)으로 변환합니다.

두 번째 경우에는 더 구체적인 유형을 사용하므로 캐스트가 필요하지 않습니다.

2
  1. 런타임에서 두 경우 모두 동일한 클래스 (ArrayList)를 사용하기 때문에 성능에 미치는 영향은 없습니다.
  2. 둘 다 문자열 목록입니다. 두 번째 차이점은 을 List로 선언했지만 으로 초기화 된 것입니다. 더 구체적인 유형의 List입니다.
  3. IDE가 상황에 맞는 제안 (Eclipse, NetBeans 등)을 사용할 때 유용합니다. 첫 번째 경우에는 추천 기능을 사용할 때마다 List 인터페이스의 멤버 만 표시됩니다. 둘째, ArrayList의 모든 (공용) 멤버를 볼 수 있습니다. 주어진 프로그래밍 상황에서 더 추상적 인 유형이 필요한 기능을 제공하는 한, 코드를보다 강력하게 만들기 때문에이를 사용하고 싶습니다. 유형이 추상적 일수록 향후 릴리스에서 변경 될 가능성이 적습니다. API의
  4. 무엇이든 표현하는 최선의 방법은 데이터를 사용하려는 대상과 그 데이터가 얼마나 많이 있는지에 따라 다릅니다. 아마도 javax.mail.internet.InternetAddress의 List 또는 Set가 청구서에 부합 할 것입니다.
  5. 인터페이스에는 서로 다른 매개 변수 유형 서명이있는 경우에만 동일한 이름을 가진 두 개의 메소드가있을 수 있습니다. 매개 변수의 이름이 다르더라도 단일 문자열을 사용하는 두 가지 메서드는 같은 이름을 가질 수 없으며 반환 형식 만 다른 두 개의 메서드를 같은 이름으로 사용할 수도 없습니다.
1
  1. 성능에 영향을 줍니까? 측정 가능한 영향은 없습니다. 귀하의 코드는 성능 문제의 근원지가 될 것이며, 이와 같은 나노 최적화는 아닙니다.
  2. 첫 번째는 객체 목록이고 두 번째 객체는 객체의 ArrayList입니다. 내가 틀렸다면 나를 바로 잡아라. ArrayList는 List Interface를 구현하기 때문에 혼란 스럽다. 정확하게. 클래스 참조가 구현되는 모든 유형에 클래스 참조를 지정할 수 있습니다.
  3. 사람들이 왜 이것을 선언합니까? 어떤 상황에서든 도움이됩니까? 예를 들어, List를 구현하는 다른 구체적인 클래스를 사용하도록 구현을 변경하려는 경우가 있습니다. LinkedList.
  4. DB에서 일부 이메일 주소를 수신 할 때 수집하는 가장 좋은 방법은 무엇입니까? 이메일 주소 개체 목록? "최고"를 정의하십시오. 사용 방법에 따라 다릅니다. 문자열로도 충분할 수 있습니다. 아마도 더 나은 추상화가 효과가있을 것입니다.
  5. 마지막으로 하나의 관련없는 질문 .... 인터페이스는 동일한 이름과 서명 및 동일한 이름을 가진 두 개의 메소드 이름이 서로 다른 서명을 가질 수 있습니다. 인터페이스는 구현이 아닌 서명을 정의합니다. 동일한 서명을 정의하는 메소드로 두 개의 인터페이스를 가질 수 있지만 실행시 하나의 구현 만있을 수 있습니다. 카우보이 및 아티스트 인터페이스가있는 경우 모두 void draw() 메서드를 사용하는 경우이 두 가지를 구현하는 클래스는 단일 구현이 무엇인지 결정해야합니다. 인터페이스에는 구현의 개념이 없기 때문에 카우보이와 아티스트를위한 하나는있을 수 없습니다.
관련 문제