Философия Java

         

Философия Java

Введение
Предпосылки
Изучение Java
Цели
Online документация
Главы

Упражнения
Мультимедийный CD ROM
Исходный код
Условные обозначения
Версии Java

Семинары и сопровождение
Ошибки
О дизайне обложки книги
Благодарности
Помощники в Интернет
Введение в объекты
Развитие абстракции
Объект имеет интерфейс

Спрятанная реализация
Повторное использование реализации
Наследование: повторное использование интерфейса
Отношения ЯВЛЯЕТСЯ против ПОХОЖ НА
Взаимозаменяемые объекты с полиморфизмом

Абстрактные базовые классы и интерфейсы
Видимость и время жизни объектов
Cборщики и итераторы
Простая корневая иерархия
Собрание библиотек и поддержка для облегчения использования собрания

Нисхождение против шаблонов/настроек
Дилемма домоводства: Кто должен убирать?
Сборщик мусора против эффективности и гибкости
Обработка исключений: работа с ошибками
Многопоточность
Живучесть
Java и Internet
Что такое Web?
Вычисления Клиент/Сервер
Web - как гигантский сервер

Программирование клиентской стороны
Рlug-ins
Языки сценариев
Java
ActiveX
Безопасность
Internet против intranet

Программирование стороны сервера
Разделенная арена: приложения
Анализ и дизайн
Фаза 0: Создание плана
Задающее утверждение
Фаза 1: Что мы делаем?

Фаза 2: Как мы это построим?
Пять стадий дизайна объектов
Руководство для разработки объектов
Фаза 3: Построение ядра
Фаза 4: Итерации использования причин
Фаза 5: Эволюция
Планы выплат
Экстремальное программирование

Первичное написание тестов
Парное программирование
Почему Java имеет успех
Система легче для выражения и понимания
Максимум рычагов управления библиотеками
Обработка ошибок
Программирование большого
Стратегии перехода
Руководящие принципы

Тренировка
Проекты низкого риска
Модель успеха
Использование библиотек существующих классов
Не переписывайте существующий в Java код
Помехи управления
Начальная стоимость
Проблемы производительности
Общие ошибки дизайна
Java против C++?

Java против C++? - 2
Резюме
By Bruce Eckel
Все есть объекты
Вы управляете объектами через ссылки
Вы должны создавать все объекты
Где живет хранилище
Особый случай: примитивные типы
Числа высокой точности

Массивы в Java
Вам никогда не нужно уничтожать объекты
Ограничивание
Границы объектов
Создание новых типов данных: классов
Поля и методы
Значения по умолчанию примитивных членов
Методы, аргументы и возвращаемое значение
Список аргументов
Построение Java программы

Видимость имен
Использование других компонентов
Ключевое слово static
Ваша первая Java программа
Компиляция и запуск
Комментарии и встроенная документация
Комментарий-Документация
Синтаксис

Вставка HTML
@See: ссылка на другой класс
Ярлыки документации класса
@Version
@Author
@Since
Ярлыки документации переменных
Ярлыки документации методов
@Param
@Return

@Throws
@Deprecated
Пример документации
Стиль кодирования
Управление течением программы
Использование операторов Java

Предшествование
Присваение
Эффект наложения при вызове методов

Философия Java


Математические операторы
Операторы унарного минуса и плюса
Автоинкремент и автодекремент
Операторы сравнения
Проверка равенства объектов
Логические операторы
Короткое замыкание
Битовые операторы
Операторы сдвига

Тернарный оператор if-else
Оператор запятая
String: оператор +
Общие ловушки при использовании операторов
Операторы приведения
Литералы
Повышение

В Java нет “sizeof”
Снова о предшествовании
Руководство по операторам
Контроль за выполнением
True и false
If-else

Итерации
Do-while
For
Break и continue
Имеющий дурную славу “goto”
Switch

Детали расчета
Инициализация и очистка
Гарантированная инициализация при использовании конструктора
Перегрузка методов

Как различать перегруженные методы
Перегрузка с помощью примитивных типов
Перегрузка по возвращаемому значению
Конструктор по умолчанию
Ключевое слово this
Вызов конструктора из конструктора
Смысл static
Очистка: финализация и сборщик мусора
Для чего нужен finalize( )?

Вы должны выполнять очистку
Смертельное состояние
Как работает сборщик мусора
Инициализация членов
Указание инициализации

Инициализация в конструкторе
Порядок инициализации
Инициализация статических данных
Явная инициализация static
Не статическая инициализация экземпляра
Инициализация массива

Многомерные массивы
Скрытие реализации
Package: модуль библиотеки

Создание уникальных имен пакетов
Коллизии
Библиотека инструментов пользователя
Использование импорта для изменения поведения
Пакетное предостережение
Спецификаторы доступа в Java
Дружественный доступ “Friendly”

Public: интерфейсный доступ
Пакет по умолчанию
Private: Вы не можете коснуться этого!
Protected: “тип дружественного доступа”
Интерфейс и реализация
Доступ класса

Повторное использование классов.
Синтаксис композиции
Синтаксис наследования
Инициализация базового класса

Конструктор с аргументами
Обработка исключений конструктора
Объединение композиции и наследования
Гарантия правильной очистки.
Порядок сборки мусора
Скрытие имен
Выборочная композиция против наследования
Protected
Инкрементная разработка

Приведение к базовому типу
Почему "приведение к базовому типу"?
И снова композиция против наследования
Ключевое слово final
Данные final
Пустые final
Аргументы final
Final методы

Final и private
Final классы
Предостережение о Final
Инициализация и загрузка классов
Инициализация с наследованием
Полиморфизм
Повторение приведения к базовому типу

Забывание типа объекта
Скручивание
Связывание метод-вызов
Выработка правильного поведения
Расширяемость
Переопределение против перегрузки
Абстрактные методы и классы

Философия Java

Конструкторы и полиморфизм
Порядок вызова конструкторов
Наследование и finalize( )
Поведение полиморфных методов внутри конструкторов
Проектировка с наследованием
Чистое наследование против расширения
Приведение к дочернему типу и идентификация типов во время работы

Интерфейсы и внутренние классы
Интерфейсы
Множественное наследование в Java
Конфликты имен при комбинировании интерфейсов

Расширение интерфейса с наследованием
Группировка констант
Инициализирование полей в интерфейсах
Вложенные интерфейсы
Внутренние классы
Внутренний класс и приведение к базовому типу
Внутренние классы в методе и контексте

Анонимный внутренний класс
Связь с внешним классом
Static внутренние классы
Ссылки на объект внешнего класса
Доступ "наружу" из множественно вложенных классов
Наследование от внутренних классов

Может ли быть внутренний класс перегружен?
Идентификаторы внутренних файлов
Зачем внутренние классы?
Замыкания обратные вызовы
Внутренние классы и структуры управления

Хранение Ваших объектов
Массивы
Массивы - первоклассные объекты

Контейнеры примитивов
Возвращение массива
Класс Arrays
Заполнение массива
Копирование массива

Сравнение массивов
Сравнение элементов массива
Сортировка массива
Поиск в отсортированном массиве
Резюме о массивах
Введение в контейнеры
Распечатка контейнера

Заполнение контейнеров
Неудобство контейнеров: неизвестный тип
Иногда это работает так или иначе

Создание сознающего тип ArrayList
Параметризированные типы
Итераторы
Неумышленная рекурсия
Таксономия контейнера
Функциональность Collection
Функциональность List

Создание стека из LinkedList
Создание очереди из LinkedList
Функциональность Set
SortedSet
Функциональность Map

SortedMap
Хеширование и хеш-коды
Понимание hashCode( )
Фактор производительности HashMap

Перегрузка hashCode( )
Хранение ссылок
WeakHashMap
Снова об итераторах
Выбор реализации
Выбор между списками (List)

Выбор между множествами (Set)
Выбор между картами (Map)
Сортировка и поиск в списках
Утилиты
Как сделать Collection или Map неизменяемой
Синхронизация Collection или Map
Провалившееся ускорение

Неподдерживаемые операции
Контейнеры Java 1.0/1.1
Vector и Enumeration
Hashtable
Stack
BitSet

Обработка ошибок с помощью исключений
Основные исключения
Аргументы исключения
Ловля исключения

Философия Java

Блок try
Обработчики исключений

Прерывание против возобновления
Создание ваших собственных исключений
Спецификация исключения
Перехват любого исключения
Повторное выбрасывание исключений

Стандартные исключения Java
Особый случай RuntimeException
Выполнение очистки с помощью finally
Для чего нужно finally?
Ловушка: потерянное исключение
Ограничения исключений

Конструкторы
Совпадение исключений
Руководство по исключениям
Система ввода/вывода в Java

Класс File
Список директории
Анонимные внутренние классы
Поиск и создание директориев
Ввод и вывод
Типы InputStream
Типы OutputStream
Добавление атрибутов и полезных интерфейсов
Чтение из InputStream с помощью FilterInputStream

Запись в OutputStream с помощью FilterOutputStream
Читающие и пишущие
Источники и приемники данных
Модификация поведения потока
Неизмененные классы
Сам по себе: RandomAccessFile
Типичное использование потоков ввода/вывода
Потоки ввода
Буферизированный ввод из файла

Ввод из памяти
Форматированный ввод из памяти
Вывод в файл
Выходные потоки
Сохранение и возврат
Чтение и запись файлов произвольного доступа
Ошибка?
Потоки в виде трубопровода
Стандартный ввод/вывод
Чтение из стандартного ввода

Замена System.out на PrintWriter
Перенаправление стандартного ввода/вывода
Компрессия
Простая компрессия с помощью GZIP
Многофайловое хранение с использованием Zip
Java архивы (JAR'ы)
Сериализация объектов

Нахождение класса
Управление сериализацией
Ключевое слово transient
Альтернатива Externalizable

Работа с версиями
Использование устойчивости
Токенизация(Tokenizing) ввода
StreamTokenizer

StringTokenizer
Проверка стиля капитализации

Идентификация типа времени выполнения
Необходимость RTTI
Объект Class
Литералы объектов Class

Проверка перед приведением типа
Использование литералов класса
Динамическое выражение instanceof
Instanceof против эквивалентности объектов Class
Синтаксис RTTI
Рефлексия: информация о классе во время выполнения

Распаковщик методов класса
Создание окон и Апплеты

Основы апплета
Ограничения апплета
Преимущества апплетов
Рабочее пространство приложения
Запуск апплетов в Web броузере
Использование Appletviewer
Тестирование апплетов
Запуск апплетов из командной строки

Отображение рабочего пространства
Использование Windows Explorer
Создание кнопок
Захват событий
Текстовые области
Управление компоновкой
BorderLayout

FlowLayout
GridLayout
GridBagLayout
Абсолютное позиционирование
BoxLayout
Лучший подход?

Философия Java

Модель событий Swing
События и типы слушателей
Использование слушающих адаптеров для упрощения
Отслеживание множественных событий
Каталог компонентов Swing
Кнопки
Группы кнопок
Иконки

Инструмент подсказки
Текстовые поля
Бордюры
Панели скроллирования
Мини редактор
CheckBox-элементы
Радио кнопки
Комбинированные поля (выпадающие списки)
Списки

Закладки
Окна сообщений
Меню
Всплывающие меню
Изображение

Окна диалогов
Файловые диалоги
HTML в Swing компонентах
Слайдеры и индикатор выполнения
Деревья
Таблицы

Выбор внешнего вида (Look Feel)
Буфер обмена
Упаковка апплетов в JAR файл
Техника программирования
Динамическое построение событий
Отделение бизнес логики от логики пользовательского интерфейса
Каноническая форма

Визуальное программирование и компоненты (Beans)
Что такое компонент (Bean)?
Извлечение BeanInfo с помощью Инспектора
Более изощренные компоненты (Bean)

Помещение компонент в пакеты
Более сложная поддержка компонент (Bean)
Больше о компонентах (Beans)

Множественные нити процессов
Отзывчивый пользовательский интерфейс
Наследование от процесса
Использование процессов для пользовательского интерфейса
Объединение процесса с основным классом
Создание множества процессов

Процессы демоны
Использование ограниченных ресурсов
Неправильный доступ к ресурсам
Как Java получает доступ к ресурсам
Синхронизация счетчиков

Эффективность синхронизации
Повторное обращение к JavaBeans
Блокировки
Установка блокировки
Засыпание
Приостановка и возобновление выполнения
Ожидание и уведомление

Блокировка во время операций ввода/вывода
Тестирование
Мертвая блокировка
Запрещение stop( ), suspend( ), resume( ), и destroy( ) в Java 2
Приоритеты
Чтение и установка приоритетов

Группы процессов
Управление группами процессов
Повторное изучение Runnable

Когда процессов слишком много
Распределенные вычисления
Сетевое программирование

Идентификация машины
Сервера и клиенты
Тестирование программ без наличия сети
Порт: уникальное место внутри машины
Сокеты
Простой пример сервера и клиента

Обслуживание нескольких клиентов
Дейтаграммы
Использование ссылок URL внутри апплета
Чтение файла с сервера
Дальнейшее сетевое программирование

Java Database Connectivity (JDBC)
Получение примера для работы
Шаг 1: Поиск JDBC Драйвера
Шаг 2: Конфигурирование базы данных

Философия Java

Шаг 3: Проверка конфигурации
Шаг 4: Генерация вашего SQL запроса
Шаг 5: Изменеие и вставка в ваш запрос
GUI версия программы поиска

Почему JDBC API выглядит так сложно
Более изощренный пример
Сервлеты
Основы сервлетов

Сервлеты и множественные процессы
Управление сессиями с помощью сервлетов
Класс Cookie
Класс Session
Запуск примеров сервлетов

Java Server Pages
Неявные объекты
Директивы JSP
Элемены JSP скриптов
Извлечение полей и значений
Атрибуты JSP страницы и границы видимости
Управление сессиями в JSP

Создание и изменение cookies
Резюме о JSP
RMI (Удаленный вызов методов)
Удаленный интерфейс
Реализация удаленного интерфейса
Регистрация
Создание якорей и скелетов
Использование удаленных объектов
CORBA

Принципы CORBA
Язык Определения Интерфейсов CORBA(CORBA Interface Definition Language) - IDL
Служба Указания Имен
Пример
Написание исходного кода IDL
Реализация сервера и клиента
Некоторые службы CORBA
Активация процесса указания имен

Активация сервера и клиента
Java Апплеты и CORBA
CORBA против RMI
Enterprise JavaBeans
JavaBeans против EJB
Спецификация EJB
EJB компоненты
EJB контейнер и сервер
Java Naming и Directory Interface (JNDI)
Java Transaction API/Java Transaction Service (JTA/JTS)

CORBA и RMI/IIOP
Составные части EJB компонента
Enterprise Bean
Домашний интерфейс
Описатель развертывания
EJB-Jar файл
EJB операции
Типы EJB
Сессионный компонент

Сущностные компоненты
Разработка EJB
Резюме о EJB
Jini: распределенные сервисы
В контексте Jini
Что такое Jini?
Как работает Jini

Процесс обнаружения
Процесс объединения
Процесс поиска
Разделение интерфейса и реализации
Абстрагирование распределенной системы
Приложение А Передача и возврат объектов.
Манипуляции с ссылками
Дублирующие ссылки (aliacing)

Создание локальных копий объектов
Передача параметров "по значению"
Клонирование объектов
Добавление клонируемости в класс
Успешное клонирование
Функции метода Object.clone()

Клонирование составных объектов
Глубокое копирование при помощи ArrayList
Глубокое копирование при помощи сериализации (serialization)
Обеспечение клонируемости объектов-наследников
Почему используется такая странная конструкция?
Управление клонируемостью объектов

Конструкторы копирования
Классы только для чтения
Создание классов только для чтения
Недостаток неизменных классов
Immutable строки

Классы String и StringBuffer
Особенности строк
Итоги
B: Java Native Interface (JNI)
Вызов собственных методов

Javah: генератор заголовочных файлов на С
Искажение имен и сигнатура функций
Реализация вашей DLL
Доступ к JNI функциям: аргументы JNIEnv
Доступ к Java строкам
Передача и использование Java объектов
JNI и исключения в Java
JNI и нити процесса
Использование существующего кода

Дополнительная информация
C: Руководящие принципы программирования на Java
Проектировка
Реализация
Программное обеспечение
Книги

Анализ и проектировка
Python
Мой собственный список книг