인터페이스에 정의 메소드가 있다는 것을 알게되면 다음과 같습니다.
public String [] getParameters ();
그런 다음 진지하게 반영해야합니다. 배열은 오래된 지식 일뿐 만 아니라 노출을 피해야 할 합리적인 이유가 있습니다. 이 기사에서는 Java API의 배열 결함을 요약하려고합니다. 가장 예상치 못한 예 중 하나부터 시작하십시오.
배열은 성능 저하로 이어집니다
배열이 대부분의 컬렉션에서 구현 된 기본 데이터 구조이기 때문에 배열 사용이 가장 빠르다고 생각할 수 있습니다. 배열 객체를 사용하는 것보다 순수한 숫자 그룹을 사용하는 것이 어떻게 낮을 수 있습니까?
친숙한이 일반적인 습관 사용부터 시작하겠습니다.
public String [] getNames () {return nameStrist.toArray (새 문자열 [nameslist.size ()];} 이 방법은 내부 보존 데이터가 사용되는 변수 컬렉션의 데이터를 생성합니다 느린다 (차트의 녹색 대 주황색 막대 참조) :
public String [] getNames () {return nameStrist.toArray (새 문자열 [0]);} 그러나 메소드가 목록을 반환하면 방어 사본을 만드는 것이 더 빠릅니다 (빨간색 막대).
공개 목록 <string> getNames () {return new ArrayList (NALESLIST);} 차이점은 Arraylist가 데이터 항목을 객체 [] 배열에 넣고 방법 유형 (파란색 막대)보다 훨씬 빠릅니다 배열 유형이 없으면 일반적인 유형의 컴파일러에 캡슐화가 캡슐화됩니다.
이 아이콘은 Java 7에서 n = 5에 대한 기준 표준을 보여줍니다. 그러나 더 많은 데이터 항목이나 다른 VM 상황 시스템은 그다지 폭력적이지 않지만 기회가있는 기회가 있습니다 컬렉션으로 변환하여 무엇이든 수행 한 다음 결과를 배열로 변환하여 다른 인터페이스 메소드로 전송합니다.
배열 대신 간단한 배열 목록을 사용하여 배열이 너무 많은 배열에 32 개의 바이트가 필요합니다 바이트.
컬렉션을 사용하면 내부 목록의 수정되지 않은 버전을 반환하기로 결정할 수도 있습니다.
공개 목록 <string> getNames () {return collections.unmodifiablelist (NALESLIST);}이 운영은 고정 된 시장 가격으로 실행되므로 다른 방법보다 훨씬 빠릅니다 (Yellow Bar). 내부 데이터가 변경되면 변경 사항을 수정할 수 없습니다. 변경 사항이 발생하면 반복적 인 데이터 항목이 동시 변형으로 실행됩니다. , 배열로 구현할 수없는 고성능 선택에 따른 것입니다.
배열은 인터페이스가 아닌 구조를 정의합니다
Java는 객체 지향 언어입니다. Object -Oriented의 핵심 개념은 데이터 도메인을 직접 작동하는 대신 데이터에 액세스하고 작동하는 몇 가지 방법을 제공하는 것입니다.
Java는 성능을 설계 했으므로 기본 유형과 배열은 유형 시스템에 통합되어 있습니다 직접 접근하면 배열에서 할 일이 많지 않습니다.
String [] array = { "foo", "bar"}; println (배열); //-> [ljava.lang.string;@6f548414 list.equals (arrays.aslist ( "foo", "bar")) //-> truerray.equals (새 문자열 [] { "fooo ","bar "}) //-> false배열과 달리 Collection API는 요소에 액세스하는 데 많은 유용한 방법을 제공합니다. 그리고 구현 원리를 동시에 유지하십시오.
데이터를 사용하면 메모리에서 데이터가 보존되는 위치를 정의하면 사용자가 데이터에서 수행 할 수있는 작업을 정의합니다.
배열은 안전한 유형이 아닙니다
컴파일러 점검의 유형에 의존하면 객체 배열에주의를 기울여야하지만 컴파일러는 문제를 찾을 수 없습니다.
숫자 [] 새 정수 [10];
그 이유는 예를 들어 T []의 하위 유형 인 경우 배열은 S []의 하위 유형이되기 때문입니다. 모든 이론과 모든 이론을 다루면 모든 Java 개발자는 읽어야합니다.
이 동작으로 인해 노출 된 배열 유형의 인터페이스는 배열 유형 선언의 하위 유형을 허용하여 이상한 런타임 이상을 유발합니다.
Bloch는 또한 배열이 일반 유형과 호환되지 않는다고 설명했습니다. 배열은 런타임 중에 유형 정보가 필요하고 컴파일 중에 일반 유형이 확인되므로 일반 유형은 배열에 배치 할 수 없습니다.
-조슈아 블록, 효과적인 Java (2 판), 제 29 조
요약
배열의 하단 계층의 언어 구조는 구현에 사용되지만 다른 클래스 노출을 사용하여 객체 지향적 인 원리를 위반하지 않아야합니다 .