Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

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

Медиа плейер на Delphi + Пояснительная записка
Метод половинного деления для нахождения корня уровнения на Turbo Pascal...
Двунаправленный динамический список на Delphi + Блок схемы

Настраиваемые типы и коллекции
Наиболее важной сферой применения настраиваемых типов можно считать подсистему 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 12 2009 21:54:39 · 0 Комментариев · 7924 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
ActiveX в Delphi
Профессиональное ...
Calendar
AlignEdit
Определние размер...
100 компонентов о...
Pirc
Strawberry Prolog...
Delphi 6. Учебный...
Применение жадног...
AddPage [Исходник...
VksButton
Использование Lis...
Модифицированная ...
Основы программир...
Добавление к ссы...
Создание оригинал...
DelphiX
mp3tag
GamesBase 3.0

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97837
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14192
Borland Delphi ... 10291
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Обеды рабочим
Обсуждение структу...
Apache. Полезные с...
Создать глобальный...
Object type expected
Кардшаринг нтв
Присвоить значение...
централизованное у...
String length mism...
Процедура SetAspec...
Предоставление сеа...
Корпус
Операторы
Этот пример являет...
ТЕХНОЛОГИИ ДОСТУПА...
Типы блокировок в ...
Преимущества испол...
Определить суммы э...
ОГП обладает приор...
Стабильный заработ...
IPSec
Страница, имеющая ...
Если вы рассчитыва...
Онлайн-казино Фан-...
Печать документа
Статистика



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


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