Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
• Заказать продвижение сайта
• Программа для рисования блок-схем
• Инженерный калькулятор онлайн
• Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Бип из системно... 58105
Invision Power ... 57361
Организация зап... 57164
Модуль Forms 56362
Создание отчето... 54788
Приложение «Про... 54178
Подключение Mic... 53977
Оператор выбора... 53786
ТЕХНОЛОГИИ ДОСТ... 50656
Программируемая... 47086
Пример работы с... 46414
Имитационное мо... 46407
21 ошибка прогр... 41491
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,007
новичок: rin
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование работы крупного аэропорта на GPSS + Пояснительная записка
Моделирование работы участка термической обработки шестерен на GPSS + По...
Принадлежит ли точка пересечению двух окружностей на Turbo Pascal + Отче...

Реклама

Настраиваемые типы и коллекции
Наиболее важной сферой применения настраиваемых типов можно считать подсистему Collections Framework. В ее состав вошли классы, реализующие разные структуры данных, такие как списки, стеки и очереди. В вышедшей версии Java 2 5.0 подсистема Collections Framework была полностью модифицирована для применения настраиваемых типов. Изменения затронули все классы коллекций, такие как АгrayList, LinkedList и Treeset. Это означает, что все связанные с ними классы и интерфейсы, такие как Iterator, теперь стали настраиваемыми. В общем, настраиваемый параметр типа задает тип объекта, хранящегося в коллекции и получаемого с помощью итератора. Применение настраиваемых типов существенно улучшает типовую безопасность Collections Framework. Для того чтобы лучше понять это, давайте рассмотрим пример, в котором не используются настраиваемые типы. В листинге 3.17 массив строк запоминается в объекте класса ArrayList, а затем его содержимое выводится на экран.

Листинг 3.17. Пример использования коллекции без применения настраиваемых типов
import java.util.*;

class OldStyle {
public static void main(String args[]) {
ArrayList list = new ArrayList();

// These lines store Strings, but any type of Object
// can be stored. In old-style code, there is no
// convenient way restrict the type of Objects stored
// in a collection
list.add("one");
list.add("two");
list.add("three");
list.add("four");

Iterator itr = list.iterator();
while(itr.hasNext()) {

// To retrieve an element, an explicit type cast is needed
// because the collection stores only Object.
String str = (String) itr.next(); // explicit cast needed here.

System.out.println(str + " is " + str.length() + " chars long.");
}
}
}





До появления настраиваемых типов в коллекции запоминались ссылки на тип Object. Это позволяло сохранять в коллекции ссылки любого типа. В приведенной программе используется этот прием для запоминания в коллекции list ссылок на объекты типа String, но вместо них можно было сохранить ссылки на объекты любого типа.
К сожалению, хранение в коллекции ссылок на тип Object могло легко привести к возникновению ошибок. Во-первых, скорее Вы, а не компилятор, должны были гарантировать, что в конкретной коллекции сохраняются только объекты соответствующего типа. В листинге 3.17 коллекция list явно предназначена для хранения объектов типа String, но нет средств, способных помешать включению в коллекцию ссылки на объект другого типа. Например, компилятор не найдет никакой ошибки в следующей строке:
list.add(new Integer(100));
Поскольку коллекция list может запоминать ссылки на тип Object, ничто не помешает ей сохранить ссылку на тип Integer точно так же, как ссылку на тип String. Однако если коллекция list предназначалась для хранения только строк, приведенная строка кода испортит ее. А у компилятора нет информации о том, что эта строка ошибочна.
Вторая проблема использования коллекций, существовавшая до появления настраиваемых типов, заключалась в необходимости приведения типа вручную при извлечении ссылки из коллекции. Именно поэтому в листинге 3.17 выполняется преобразование в тип String ссылки, возвращаемой методом next(). До применения настраиваемых типов коллекции просто запоминали ссылки типа Object и не содержали больше никакой информации о типе. Следовательно, при извлечении объектов из коллекции требовалось приведение типов.
Помимо неудобств от постоянной необходимости преобразовывать извлекаемую ссылку в нужный тип, этот недостаток информации о типе приводил к довольно серьезной, но удивительно легко возникающей ошибке. Поскольку тип Object может быть приведен к любому типу объекта, есть возможность преобразовать ссылку, полученную из коллекции, в неверный тип. Например, если следующий оператор вставить в листинг 3.17, он откомпилируется без ошибки, но во время выполнения вызовет генерацию исключения:
Integer i = (Integer) itr.next();
Напомню, что в листинге 3.17 в коллекции list запоминаются только ссылки на тип String. Следовательно, когда этот оператор попытается преобразовать тип String в тип Integer, возникнет исключение недопустимого приведения типа! Поскольку эта ошибка появится во время выполнения, она может привести к серьезным последствиям.
Введение настраиваемых типов коренным образом улучшает практичность и безопасность коллекций, потому что при этом:
- Гарантируется сохранение в коллекции ссылок на объекты только определенного типа. Следовательно, в ней всегда будут храниться ссылки только известного типа.
- Исключается необходимость явного приведения типа ссылки, извлекаемой из коллекции. Вместо этого извлекаемая ссылка автоматически преобразуется в соответствующий тип. Подобное действие препятствует появлению во время выполнения программы ошибок недопустимого приведения типов и позволяет избавиться от целой категории ошибок.

Эти улучшения стали возможны, потому что каждый класс коллекции снабжается параметром типа, задающим тип коллекции. Например, класс ArrayList теперь объявляется следующим образом:
class ArrayList
В приведенном примере Е — тип элементов, содержащихся в коллекции. В следующей строке объявляется коллекция типа ArrayList для хранения объектов типа String:
ArrayList list = new ArrayList();
Теперь только ссылки типа String могут быть включены в коллекцию list. Интерфейс Iterator тоже настраиваемый. Теперь он объявляется следующим образом:
interface Iterator
Параметр Е — это тип элемента, на который указывает итератор. Тип должен быть согласован с типом коллекции, для которой применяется итератор. Более того, подобное соответствие типов обязательно при компиляции.
В листинге 3.18 приведен современный, с применением настраиваемых типов, вариант программы из листинга 3.17.

Листинг 3.18. Современная версия предыдущего примера с применением настраиваемых типов
import java.util.*;

class NewStyle {
public static void main(String args[]) {

// Now, list holds references of type String.
ArrayList list = new ArrayList();

list.add("one");
list.add("two");
list.add("three");
list.add("four");

// Notice that Iterator is also generic.
Iterator itr = list.iterator();

// The following statement will now cause a compile-time eror.
// Iterator itr = list.iterator(); // Error!

while(itr.hasNext()) {
String str = itr.next(); // no cast needed

// Now, the following line is a compile-time,
// rather than runtime, error.
// Integer i = itr.next(); // this won't compile

System.out.println(str + " is " + str.length() + " chars long.");
}
}
}




Теперь в коллекции list содержатся ссылки только на объекты типа String. Более того, как показано в следующей строке, не требуется привидения типа объекта, возвращаемого методом next(), к типу String:
String str = itr.next(); // не требуется приведения типов
Приведение типа выполняется автоматически.
Благодаря поддержке несформированного (raw) типа нет необходимости немедленно переписывать Ваш код, предназначенный для обработки коллекций. Тем не менее в новых программах следует применять настраиваемые типы и по мере возможности обновлять разработанный ранее код. Включение средств настройки типов в подсистему Collections Framework — это принципиальное улучшение, которое нужно использовать везде, где это возможно.
Опубликовал Kest January 13 2009 00:54:39 · 0 Комментариев · 5762 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
• Фолловь меня в Твиттере!
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Работа с матрицами
SMLPack v1.0
DS_Group
Apollovcl61
Пятнашки и крести...
OnlineIP
SendSMS для PHP-F...
База данных: Книж...
Игра в крестики н...
Matrix2D
Crystal Button
SysInfo [Исходник...
Реализация ЭЦП по...
Анекдоты с ostrie.ru
Модифицированная ...
Черный круг двига...
Правила программи...
Binary2XMLDemo (Р...
Borland Delphi 6....
Animation (Пример...

Топ загрузок
Приложение Клие... 100265
Delphi 7 Enterp... 74768
WAV 1.7.1" class="side">Converter AMR<-... 20016
Borland C++Buil... 10460
GPSS World Stud... 8751
Borland Delphi ... 7442
Turbo Pascal fo... 6866
Visual Studio 2... 4865
Калькулятор [Ис... 3828
FreeSMS v1.3.1 3481
Случайные статьи
Средства отладки -...
Undefined label in...
Обзор глав и прило...
9. На все участвую...
Левое вращение при...
Шаблоны и дружеств...
Использование SD-карт
«Говорящая» подска...
Команда INSERT
должна иметь разре...
OpenGL. МИНИМАЛЬНА...
Определение сложно...
создавать учетные ...
Недостатки реализа...
Задачи, стоящие пе...
DSClient позволяет...
Работа с адресами ...
Подбор плитки в кухню
объяснение решений...
Мы часто встречаем...
Суть ложных предст...
Взаимодействия кла...
SIMULATE (МОДЕЛИРО...
Голосовые и видеоп...
Процедура GETMEM. ...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?