Углубленное программирование
на JavaЛекция 6
«Утилиты»
Виталий Чибриков
base
dbService
Схема сервера
2
utils
messageSystem
frontend
main
gameMechanics
resourceSystem
План лекции
1. Singleton и Context
2. Exception и Throwable
3. Events и Callbacks
4. Анонимные классы
5. Random
6. Time и Date
7. I/O streams
8. VFS
3
Singleton
Singleton
4
Позволяет создать только один объект данного типа на процесс
Аналог статического поля, с «отложенной» инициализацией
Содержит приватное статическое поле типа своего же класса (instance)
Приватный конструктор
Статический метод instance() который возвращает instance класса
Singleton
5
Context
6
Map<класс, объект этого класа>
Хранит сылки на объекты по ключу – классу объекта
Обертка над картой
1. Проверяет, что служба в единственном экземпляре,даже если служба не singleton
2. Содержит ссылки на множество служб, которые могут понадобиться методам объектов процесса
3. Позволяет создать только те объекты, которые нужны процессу
4. Список нужных служб можно хранить в конфиге
Context
7
План лекции
8
1. Singleton и Context
2. Exception и Throwable
3. Events и Callbacks
4. Анонимные классы
5. Random
6. Time и Date
7. I/O streams
8. VFS
Задачи исключений
9
«второй» способ выхода из функции
возможность вернуть код ошибки
«проброс» данных через call stack
уведомление вызывающей стороны о не корректных данных
уведомление о состоянии которое код не может исправить
Пример
10
Варианты результата вызова функции:
значение
null
exception
Рассмотрим функцию чтения id по имени из базы
public Integer getId(String name){…}
Throwable
11
Наследование
12
Exception
13
public class Exception extends Throwable
public Exception()
public Exception(String message)
public Exception(String message, Throwable cause)
public Exception(Throwable cause)
public class GMException extends Exception
public GMException(){…}
public GMException(String message, Throwable cause){super(message, cause)…
}
Пример использвания
14
План лекции
15
1. Singleton и Context
2. Exception и Throwable
3. Events и Callbacks
4. Анонимные классы
5. Random
6. Time и Date
7. I/O streams
8. VFS
Events
16
Задача
Служба в которой происходят некоторые события – EventSource
Службы которые должны реагировать на эти события – EventListeners
Нужен механизм оповещения о событии и передачи инфорации об источнике
Реализация
EventSource
EventListenerInterface
EventListenerImpl
Pattern Observer
17
Event listener
18
Event source
19
Примеры подписок
20
Старт сервера
События игрового мира
Вход/выход пользователя на карту
Наступление определенного момента времени
Задача
Реализация
Callback
21
Вы используете внешнюю библиотеку
Событие во внешней библиотеке должно повлиять на ваш код
Ваш метод который будет вызван по событию – callback
Вы должны передать в библиотеку свой метод
С++: ссылка на функцию
С#: делегаты
Java: вы передаете объект реализующий библиотечный интерфейс
Callback
22
Пример:
План лекции
23
1. Singleton и Context
2. Exception и Throwable
3. Events и Callbacks
4. Анонимные классы
5. Random
6. Time и Date
7. I/O streams
8. VFS
Если вы передаете в метод новый объект класса по интерфейсу,не обязательно создавать отдельный класс.
Анонимные классы
24
Явное создание класса
Точно также можно создать анонимный наследник абстрактного класса
Анонимные классы
25
Анонимный класс
План лекции
26
1. Singleton и Context
2. Exception и Throwable
3. Events и Callbacks
4. Анонимные классы
5. Random
6. Time и Date
7. I/O streams
8. VFS
Pseudorandom number generator — алгоритм, порождающий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению
Нет понятия случайного числаЕсть последовательности чисел с заданным распределением
Random
27
Алгоритм случайности
28
Linear Congruential Pseudorandom Number Generator (See Donald Knuth, The Art of Computer Programming, Volume 3, Section 3.2.1.)
java.util.Random
modulus
increment
multiplier
seed
Math.random(); – вернет случайное число типа doubleот 0 до 1При каждом запуске последовательность будет новой
Random rnd = new Random(1L);rnd.nextInt(100); – вернет случайное число от 0 до 99При каждом запуске последовательность будет прежней
Random rnd = new Random();rnd.nextInt(100); – вернет случайное число от 0 до 99При каждом запуске последовательность будет новой
Random in java
29
…Sid Meier found that if a player lost too many 2-to-1 battles in a row, they would get frustrated. Instead of risking a player shutting the game down, Sid changed the math :o)
Субъективная случайность
30
Видео (Sid Meier GDC 2010):
http://www.youtube.com/watch?v=bY7aRJE-oOY
План лекции
31
1. Singleton и Context
2. Exception и Throwable
3. Events и Callbacks
4. Анонимные классы
5. Random
6. Time и Date
7. I/O streams
8. VFS
Time & Date
32
Работа со временем
Работу со временем лучше перенести в TimeHelper
От миллисекунд до даты
UNIX или POSIX time – время с 1 января 1970 в секундах
Фарматирование даты и времени для пользователей
Как хранить время в приложении и в базе
Подписка на таймер
TimeHelper
33
Timer
34
java.unil.Timer
java.unil.TimerTask
Порядок работы:
Создаем timer
Создаем класс унаследованный от TimerTask
Пишем в методе run() код, который будет выполнен по таймеру
Передаем в timer таск и время, через которое надо выполнить таск
Ждем положенное время
PROFIT!!!
Выключаем timer через timer.cancel();
Timer
35
План лекции
36
1. Singleton и Context
2. Exception и Throwable
3. Events и Callbacks
4. Анонимные классы
5. Random
6. Time и Date
7. I/O streams
8. VFS
I/O ― общение с внешними устройствами (файлы, принтеры, сеть и т.д.)
Поток ― объект который представляет источник или приемник данных
Поток основан на последовательности битов данных
I/O, потоки
37
InputStream
OutputStream
Основная задача ― читать байт за байтом из входного потока
Основные методы:
abstract int read()
int read(byte[] b)
void mark(int readlimit)
void reset()
void close()
public abstract class InputStream
InputStream
38
Byte Streams
39
OutputStream
InputStream
PrintStream
FilterOutputStream BufferedOutputStream
DataOutputStream
FileInputStream
FilterInputStream
FileOutputStream
BufferedInputStream
DataInputStream
Переопределяет все методы InputStream вызывая методы поля in
Наследники этого класса могут менять работу потока в поле in
Decorator pattern
FilterInputStream
40
Decorator
41
Decorator
42
Рассмотрим сериализованные java объекты, которые лежат в gzipархиве и которые мы хотим быстро прочесть.
Для начала откроем inputstream для файла:FileInputStream fis = new FileInputStream("/objects.gz");
Читать побитово для нас слишком долго -- буферизуем чтение:BufferedInputStream bis = new BufferedInputStream(fis);
Файл зазипован -- нам надо его разархивировать:GzipInputStream gis = new GzipInputStream(bis);
Теперь десиериализуем java объекты:ObjectInputStream ois = new ObjectInputStream(gis);
И, наконец, прочитаем:SomeObject someObject = (SomeObject) ois.readObject();
Character Streams
43
SimpleFileReader
44
CustomFileReader
45
Закрытие потоков
Для особождения ресурсов все потоки должны быть закрыты
BufferedReader br = null;try{
//codebr = new BufferedReader(isr);//code
} catch (Exception e){System.err.println("Error: " + e.getMessage());
} finally {if(br != null){
try {br.close();
} catch (IOException e) {System.err.println("Error: " + e.getMessage());
}}
}46
File ― представление пути к файлу или директории
Скрывает от приложения детали пути к файлу конкретной ОС
File
47
Основные методы
boolean exists();
String getAbsolutePath();
boolean isDirectory();
boolean createNewFile();
boolean mkdir();
boolean delete();
boolean deleteOnExit();
План лекции
48
1. Singleton и Context
2. Exception и Throwable
3. Events и Callbacks
4. Анонимные классы
5. Random
6. Time и Date
7. I/O streams
8. VFS
VFS
49
Virtual File System ― модуль для работы с файлами
VFS
50
Iterator<String>
51
Спасибо за внимание
Виталий Чибриков[email protected]
Recommended