2009-10-14 6 views
0

이야기에 흥미가 없다면 처음 두 단락을 건너 뛰십시오.서브 클래 싱 배열

나는 배열에 대해 친구와 이야기하고 있었고 Objective C와 같은 범위 밖의 객체에 액세스하려고 시도하는 이유는 무엇입니까 (내 주요 언어 임). 그래서 우리는 논쟁을 벌였습니다. 그리고 나는 그에게 당신이 범위를 벗어나지 만 충돌을 일으키지 않는다면 null을 반환하고 오류를 출력하는 Array (GeniusArray로 이름지었습니다)를 작성할 수 있다고 말했습니다.

잠자다가 넘어지면 경계에서 벗어난 요소에 액세스하는 경우 코드에 심각한 오류가 발생하고 응용 프로그램이 다운되지 않아서 문제를 해결할 수 있습니다. - D

하지만 여전히 : 내 지점을 증명하고 배열을 서브 클래스 화해, 문이 모든 프로그래머가 비교적 자주 쓰는 경우 기본적으로이 일을 추가하여 GET() 메소드를 오버라이드 (override)하고 싶습니다 :

// Pseudo code... 
if (index < array.count) element= array[index]; 

나는 그것이 나의 친구가 "아는"것입니다 (btw, 우리는 두 학생이기 때문에) Objective C가 아닌 Java로하고 싶습니다.

긴 이야기를 짧게 자르기 : Array를 서브 클래스하려고했지만 작동하지 않습니다.

액세스 제한 : 유형 Attribute.Array 필요한 라이브러리에 제한을 인해 액세스 할 수 없습니다 : /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0 나는 팅이를 얻을 수있어 /Classes/classes.jar GeniusArray.java

+1

"범위를 벗어나는 요소에 액세스하는 경우 코드에 심각한 오류가 있으며 응용 프로그램이 다운되지 않아서 문제를 해결할 수 있음을 알았습니다. :-D"- 이것은 아주 정확한 관찰. 만약 당신이'GeniusArray'의 사이즈가 0이고'geniusArray [0].foo()'를 호출하면 프로그램은 계속 충돌하지만보다 의사 소통하기 쉬운 ArrayIndexOutOfBoundsException보다는 디버그가 가능한'NullPointerException'을 사용합니다. 'null '을 반환하는 것은 결코 프로그래밍 오류를 처리하는 방법이 아닙니다. – gustafc

+0

C 및 C++의 실제 문제는 Objective C가 말한 것처럼 인덱스가 범위를 벗어난 것을 감지하지 못한다는 것입니다. 따라서 보장 된 충돌보다는 무엇이든 일어날 수 있습니다. 이것은 훨씬 더 심각합니다. 예를 들어 모든 버퍼 오버플로 보안 구멍이 발생합니다. – starblue

답변

1

C, C++ 및 Objective-C와 같은 언어는 배열 범위를 검사하지 않으므로 예측할 수 없습니다 성능상의 이유로 인덱스가 유효하지 않은 배열에 액세스하려고하면 오류가 발생합니다.

Java는 모든 배열 액세스에서 배열 경계를 검사하며 잘못된 색인을 사용하면 ArrayIndexOutOfBoundsException이 표시됩니다. 어떤 사람들은 자바 내장 검사 배열이 다른 프로그래밍 언어보다 비효율적이라고 주장합니다.

+0

try/catch 블록을 사용하여 java.lang.IndexOutOfBoundsException을 catch하고 응용 프로그램이 중단되지 않았습니다 (원하는 내용). 이게 자바에서 GeniusArray로 한 일을하는 더 좋은 방법 인 것 같습니다. 고맙습니다. – Chilloutman

1

예. 예. 배열에서 서브 클래스를 만들 수 없다는 것을 발견했습니다. ArrayList로부터 서브 클래스를 만들어야하고 Decorator 패턴을 사용하여 get() 메소드 (및 관련)를 인터셉트해야합니다.

안타깝게도 []에 연산자 오버로드를 제공 할 수 없으므로 원래 목표에서 어느 정도 거리가 있습니다.

+0

고맙습니다. 이 데코레이터 패턴을 살펴 보겠습니다. – Chilloutman

1

내가 아는 한, 당신은 정말로 자바로 Array를 서브 클래스화할 수 없다 (이것은 특별한 타입이다). VM는 서브 클래 싱이 엉망이 될 수있는 배열에 대해 몇 가지 가정을합니다.

일반적으로 배열에서 벗어나려고합니다. 대신 ArrayList를 사용하십시오.

3

클래스 만 서브 클래 싱 할 수 있습니다. 배열 유형은 클래스가 아닙니다. (here : "클래스 유형, 인터페이스 유형 및 배열 유형의 세 가지 참조 유형이 있습니다.")

+0

아, 재미 있어요! 나는 Array가 객관적 C의 "NSArray"클래스와 같은 클래스라고 가정했습니다. Java에 관해서는 많은 것을 배워야 할 것입니다. – Chilloutman

관련 문제