Навигация
Главная
Поиск
Форум
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
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 65383
Модуль Forms 65160
Пример работы с... 64247
ТЕХНОЛОГИИ ДОСТ... 61804
Имитационное мо... 57719
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

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

База данных - рабочее место кассира на Delphi + бд Access
База данных электронного документооборота на Delphi + бд Intebase
База данных - словарь терминов на Delphi + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Настраиваемые типы и коллекции
Наиболее важной сферой применения настраиваемых типов можно считать подсистему 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 Комментариев · 6562 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Импорт новостей ...
CoolControls v3.0...
Использование Lis...
PHP 5 в подлинник...
AdBlaster v2.5 - ...
Работа с базами д...
База англоязычных...
Создание лабиринт...
Дарахвелидзе П., ...
MicroGPSS Studen ...
Программа "AutoRu...
JanButtonsV
Работа с матрицами
Dynamic Titles дл...
Искусство програм...
Фундаментальные а...
Правила программи...
Printgrid
Java Server Pages...
Фильтры изображений

Топ загрузок
Приложение Клие... 100468
Delphi 7 Enterp... 87024
Converter AMR<-... 20078
GPSS World Stud... 12793
Borland C++Buil... 11819
Borland Delphi ... 8600
Turbo Pascal fo... 7039
Visual Studio 2... 4999
Калькулятор [Ис... 4795
FreeSMS v1.3.1 3542
Случайные статьи
Процедура Arc - че...
Настройка Windows ...
ZCE:личные впечатл...
Типовая структура ...
Network File System
PowerShell - продо...
Анализ результатов...
POD-типы
Функции ввода/вывода
Сетевые эмуляторы
«Использование» ша...
Использование CRON...
Зеркала для волн р...
Коллективное владение
ДЫРЫ В ЧАТАХ
Выработка решенияП...
Как раскрутить спе...
Любую форму using ...
Секреты: принцип р...
HTTPS; третий позв...
Как реализуется поиск
Мониторинг состоян...
Теперь давайте пос...
Отправка по факсу ...
Частные клиники Ка...
Статистика



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


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