2009-10-14 4 views
0

Если вам не интересна история, пропустите первые 2 абзаца.Subclassing Array

Я говорил с другом о массивах и почему они (все еще) сбой, если вы пытаетесь получить доступ к объекту, который находится за пределами «современных» языков, таких как Objective C (Это мой основной язык). Поэтому мы вошли в дебаты, и я сказал, что могу написать ему массив (я назвал его GeniusArray), который возвращает null и выводит ошибку, если вы пытаетесь получить доступ к чему-то за пределами, но не сбой.

После того, как я проспал, я понял, что если вы обращаетесь к элементам, находящимся за пределами границ, у вас есть серьезные ошибки в вашем коде, и это может быть неплохо для приложения, чтобы сбой, поэтому вы вынуждены его исправлять. :-D

Но все-таки: я хотел бы, чтобы доказать свою точку зрения и подкласс массива и переопределить метод Get() по сути, добавив этот, если утверждение, что каждый программист пишет относительно часто:

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

Я хочу сделать это на Java, а не на Objective C, потому что это то, что мой друг «знает» (кстати, мы оба учащиеся).

Чтобы сократить длинную историю, я попытался подклассифицировать массив, но он, похоже, не работает. Я получить тины это: ограничение

доступа: Тип Attribute.Array не доступен из-за с ограничением требуемой библиотеки: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0 /Classes/classes.jar GeniusArray.java

+1

«Я понял, что если вы обращаетесь к элементам, находящимся за пределами границ, у вас есть серьезные ошибки в вашем коде, и это может быть неплохо для приложения, чтобы сбой, поэтому вы вынуждены его исправлять.: -D» - это очень правильное наблюдение. Если у вас был «GeniusArray» размером 0 и сказал «geniusArray [0].foo() ', программа все равно будет терпеть крах, но с гораздо менее отлажимым« NullPointerException », а не более коммуникативным« ArrayIndexOutOfBoundsException ». Возвращение «null» никогда не является способом обработки ошибки программирования - метать. – gustafc

+0

Реальная проблема с C и C++, и, как вы говорите, Objective C, заключается в том, что они не обнаруживают, что индекс за пределами границ. Поэтому, чем гарантированный сбой, все может случиться. Это намного хуже, например, он вызывает все эти отверстия для предотвращения переполнения буфера. – starblue

ответ

1

Языки, такие как C, C++ и Objective-C, не проверяют границы массива (и, следовательно, приводят к непредсказуемым если вы пытаетесь получить доступ к массиву с недопустимым индексом) по соображениям производительности.

Java действительно проверяет границы массива на каждый доступ к массиву, и вы получите ArrayIndexOutOfBoundsException, если используете недопустимый индекс. Некоторые люди утверждают, что из-за этого встроенные контрольные массивы в Java менее эффективны, чем на других языках программирования.

+0

Я использовал блок try/catch, чтобы поймать java.lang.IndexOutOfBoundsException, и приложение не сработало (это то, что я хотел). Похоже, что это лучший способ сделать то, что я сделал с GeniusArray в Java. Спасибо. – Chilloutman

1

Да. Как вы обнаружили, вы не можете подкласса из массива. Вам нужно подклассировать (скажем) ArrayList и использовать шаблон Decorator для перехвата методов get() (и связанных).

К сожалению, вы не можете предоставить операционную перегрузку для [], так что вы будете находиться на некотором расстоянии от своей первоначальной цели.

+0

Спасибо. Я посмотрю на этот узор Decorator. – Chilloutman

1

Насколько я помню, вы действительно не можете подклассифицировать Array на Java (это особый тип). VM делает некоторые предположения о массивах, которые могут испортить подклассы.

Обычно я стараюсь держаться подальше от массивов. Вместо этого используйте ArrayLists.

3

Только классы могут быть подклассы. Типы массивов не являются классами. (От here: «Существует три типа ссылочных типов: типы классов, типы интерфейсов и типы массивов.»)

+0

О, это интересно! Я предположил, что Array - это класс, подобный классу «NSArray» в объекте C. Я вижу, что мне нужно многому научиться в отношении Java. – Chilloutman