Java의 배열은 길이가 고정되어 있습니다. Java가 크기 0의 배열을 허용하는 이유는 무엇입니까?
String[] strings = new String[0];
답변:
Java가 크기 1의 배열을 허용하는 이유는 무엇입니까? 단일 값을 배열로 래핑하는 것은 꽤 쓸모가 없습니까? Java가 크기 2 이상의 배열 만 허용하면 충분하지 않을까요?
예, 우리 null는 빈 배열 대신 단일 객체 또는 크기 1 행렬 대신 기본 요소를 전달할 수 있습니다 .
그러나 그러한 제한에 대해 몇 가지 좋은 주장이 있습니다. 내 개인적인 주요 주장 :
제한이 너무 복잡하고 실제로 필요하지 않습니다.
배열의 크기를 [1..INTEGER.MAX_INT]로 제한하려면 코드 에 많은 추가 boudary 검사, (Konrads 의견에 동의) 변환 논리 및 메서드 오버로드를 추가해야합니다. 허용 된 어레이 크기에서 0 (또는 1)을 제외하면 비용이 절감되지 않으며 추가 노력이 필요하며 성능에 부정적인 영향을 미칩니다.
배열 모델 벡터
배열은 벡터에 대한 좋은 데이터 모델 (수학, 하지Vector 클래스!). 물론 수학의 벡터는 0 차원 일 수 있습니다. 개념적으로 존재하지 않는 것과 다릅니다.
사이드 노트 -(char-) 배열의 눈에 띄는 래퍼가 String클래스입니다. 불변 String은 빈 배열의 개념을 구체화합니다 "". 빈 문자열 ( )입니다.
>= 0로 > 0). 그러나 나머지 부분에 대해서는 당연히 맞으므로이 제한을 추가하는 것은 의미가 없습니다.
이것을 고려하십시오 (정오의 대답에 대한 더 자세한 설명) :
public String[] getStrings() {
if( foo ) {
return null;
} else {
return new String[] {"bar, "baz"};
}
}
String[] strings = getStrings();
if (strings != null) {
for (String s : strings) {
blah(s);
}
}
이제 이것을 다음과 비교하십시오.
public String[] getStrings() {
if( foo ) {
return new String[0];
} else {
return new String[] {"bar, "baz"};
}
}
// the if block is not necessary anymore
String[] strings = getStrings();
for (String s : strings) {
blah(s);
}
이것은 (널 값이 아닌 빈 배열을 반환하는) 사실 Java API 디자인 세계에서 가장 좋은 방법입니다.
게다가 Java에서는 목록 (예 : ArrayList)을 배열로 변환 할 수 있으며 빈 목록을 빈 배열로 변환하는 것만이 의미가 있습니다.
빈 배열이 매우 유용하다고 생각할 수있는 한 가지 경우는 null이 허용되지 않는 상황에서 null 대신 사용하는 것입니다. 한 가지 가능한 예는 배열의 BlockingQueue입니다. 읽기쪽에 입력의 끝을 알리고 싶을 때 어떻게 하시겠습니까? null을 보내는 것은 당연한 선택처럼 보이지만 BlockingQueue는 null을 허용하지 않습니다. " boolean last;"종류의 필드를 사용하여 클래스 내부에 배열을 래핑 할 수 있지만 이는 일종의 과잉입니다. 빈 (크기가 0 인) 배열을 보내는 것이 가장 합리적인 선택 인 것 같습니다.
test(Object... objects)가있을 때 명시 적 함수를 호출하는 데 유용 합니다test()