- •Основы программирования на языке java в среде eclipse
- •Ответственный за выпуск: в.И. Павловський, зав. Кафедрою информационных и компьютерных систем, канд. Техн. Наук, доцент.
- •2.1 Задание на лабораторную работу 19
- •7.3 Порядок выполнения работы 103
- •7.4 Содержимое отчета 103
- •7.5 Контрольные вопросы 104
- •Введение
- •1Лабораторная работа №1 Изучение среды разработки Eclipse
- •1.1 Задание на лабораторную работу
- •1.2 Краткие теоретические сведения
- •1.2.1Создание проекта
- •1.2.2Создание нового класса Java
- •1.3 Порядок выполнения работы
- •1.4 Содержимое отчета
- •Краткие теоретические сведения.
- •1.5 Контрольные вопросы
- •2Лабораторная работа №2 Основы языка Java
- •2.1 Задание на лабораторную работу
- •2.2 Краткие теоретические сведения
- •2.2.1Создание объектов
- •2.2.2Примитивные типы
- •2.2.3Числа высокой точности
- •2.2.4Уничтожение объектов
- •2.2.5Видимость имен
- •2.2.6Использование других компонентов
- •2.2.7Ключевое слово static
- •2.2.8Массивы
- •2.2.9Обработка ошибок с помощью исключений
- •2.3 Порядок выполнения работы
- •2.4 Содержимое отчета
- •2.5 Контрольные вопросы и задания
- •3Лабораторная работа №3 Объектная модель языка Java
- •3.1 Задание на лабораторную работу
- •3.2 Краткие теоретические сведения
- •3.3 Порядок выполнения работы
- •Краткие теоретические сведения.
- •4.2 Краткие теоретические сведения
- •4.2.1Классы дерева и узла
- •4.2.2Вопросы сокрытия реализации
- •4.2.3Пользовательский интерфейс
- •4.3 Порядок выполнения работы
- •4.4 Содержимое отчета
- •Краткие теоретические сведения.
- •4.5 Контрольные вопросы
- •5Лабораторная работа №5 Изучение основ объектно-ориентированного программирования на языке Java. Часть 2
- •5.1 Задание на лабораторную работу
- •5.2 Краткие теоретические сведения
- •5.2.1Классы деревьев и интерфейсы
- •5.2.2Рекурсивный проход по деревьям разных классов
- •5.2.3Расширение ранее созданных классов специфическими операциями пользователей
- •5.2.4Вопросы оптимизации кода
- •5.3 Порядок выполнения работы
- •5.4 Содержимое отчета
- •Краткие теоретические сведения.
- •5.5 Контрольные вопросы
- •6Лабораторная работа №6 Изучение коллекций Java и системы ввода-вывода
- •6.1 Задание на лабораторную работу
- •6.2 Краткие теоретические сведения
- •6.2.1Представление и реализация дерева на основе коллекций
- •В описании узла дерева необходимо создать и инициализировать объект класса список или набор сыновей, например
- •Количество сыновей узла дерева определяется следующим образом:
- •Элементу набора с индексом I выполняется путем получения массива из набора
- •6.2.2Представление и реализация дерева на основе ассоциативных массивов (карт отображений)
- •В описании узла дерева необходимо создать и инициализировать объект ассоциативный массив сыновей, например
- •Количество сыновей узла дерева определяется следующим образом:
- •6.2.3Доступ к коллекции или ассоциативному массиву через итератор
- •6.2.4Использование обобщений Java 5
- •В описании узла дерева необходимо создать и инициализировать коллекцию настраиваемый список, например
- •6.2.5Сериализация и десериализация дерева в файл
- •6.2.6Ввод и вывод в потоки со сжатием данных
- •6.3 Порядок выполнения работы
- •Краткие теоретические сведения.
- •7.2 Краткие теоретические сведения
- •7.2.1Многопоточность
- •7.2.2Процессы, потоки и приоритеты
- •7.2.3Приоритеты потоков в приложениях Java
- •7.2.4Реализация многопоточности в Java
- •7.2.5Функциональность класса Thread
- •7.2.6Реализация интерфейса Runnable
- •7.2.7Синхронизация потоков
- •7.2.8Синхронизация методов
- •7.2.9Блокировка потока
- •7.2.10Синхронизация доступа к совместно используемым данным.
- •7.2.11Избыточная синхронизация
- •7.2.12Вызов метода wait
- •7.2.13Документирование уровней безопасности
- •7.2.14Работа с графикой Графика 2d
- •Пространства координат
- •Режим рисования
- •Создание цвета
- •Основные методы рисования
- •Рисование фигур средствами Java2d
- •Класс BasicStroke
- •Класс GeneralPath
- •Классы GradientPaint и TexturePaint
- •7.3 Порядок выполнения работы
- •7.4 Содержимое отчета
- •Краткие теоретические сведения;
- •7.5 Контрольные вопросы
- •Многопоточность;
- •РекомендУемая литература
5.2.4Вопросы оптимизации кода
Прежде чем переходить к написанию лабораторной работы следует рассмотреть дополнительную возможность по сокращению кода, необходимого для реализации конкретных классов реализации деревьев. Если внимательно проанализировать задачу, становится понятно, что в реализации обоих вариантов деревьев есть много схожего. Фактически вся работа по выполнению операций над деревом выполняется узлами дерева, сами же классы реализации дерева осуществляют лишь координационную работу.
Подход "в лоб" основывается на написании различных реализаций для каждого типа дерева, которые, в конечном итоге, будут отличаться лишь классами узлов, используемых в дереве.
Но возможно оптимальное решение. В связи с этим рекомендуется создать один класс реализации дерева, работающий только с интерфейсами узлов, а также два подкласса, задачей которых будет создание корневых узлов нужного типа, например:
/* BaseTree.java */ 1 public class BaseTree implements ITree { 2 private INode root; 3 // Особенности реализации 4 public BaseTree() { 5 root = createRoot();// создание корневого узла 6 } 7 } //~ |
/* LinkedTree.java */ 1 public class LinkedTree extends BaseTree { 2 protected INode createRoot() { 3 return new LinkedNode(); 4 } 5 } //~ |
/* ArrayTree.java */ 1 public class ArrayTree extends BaseTree { 2 protected INode createRoot() { 3 return new ArrayNode(); 4 } 5 } //~ |
Остается только один неясный момент, а именно метод createRoot() используется в классе BaseTree, поэтому его необходимо определить в этом же классе. Но в то же время мы не знаем, как этот метод должен быть реализован, поскольку это может быть уточнено только в подклассах.
Чтобы решить эту проблему в классе BaseTree необходимо только определить метод createRoot(), но вместо того, чтобы предоставлять реализацию метода – объявить его как абстрактный, тем самым, заставив подклассы определить его реализацию.
Поскольку в классе BaseTree присутствует хотя бы один абстрактный метод, то сам класс также необходимо определить как абстрактный. В этом случае для него лучшим названием будет AbstractTree. Такой принцип именования можно часто встретить в стандартной библиотеке Java. Окончательный вариант базовой реализации дерева будет выглядеть следующим образом:
1 public abstract class AbstractTree implements ITree { 2 private INode root; 3 // Особенности реализации 4 public BaseTree() { 5 root = createRoot(); // создание корневого узла 6 } 7 protected abstract INode createRoot(); 8 } |
На рисунке 5.6 приведена финальная диаграмма наследования классов и реализации интерфейсов INode и ITree.
Рисунок 5.6 - Диаграмма наследования классов и интерфейсов.
