52
Углубленное программирование на Java Лекция 6 «Утилиты» Виталий Чибриков

Java осень 2013 лекция 6

Embed Size (px)

Citation preview

Page 1: Java осень 2013 лекция 6

Углубленное программирование

на JavaЛекция 6

«Утилиты»

Виталий Чибриков

Page 2: Java осень 2013 лекция 6

base

dbService

Схема сервера

2

utils

messageSystem

frontend

main

gameMechanics

resourceSystem

Page 3: Java осень 2013 лекция 6

План лекции

1. Singleton и Context

2. Exception и Throwable

3. Events и Callbacks

4. Анонимные классы

5. Random

6. Time и Date

7. I/O streams

8. VFS

3

Page 4: Java осень 2013 лекция 6

Singleton

Singleton

4

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

Аналог статического поля, с «отложенной» инициализацией

Содержит приватное статическое поле типа своего же класса (instance)

Приватный конструктор

Статический метод instance() который возвращает instance класса

Page 5: Java осень 2013 лекция 6

Singleton

5

Page 6: Java осень 2013 лекция 6

Context

6

Map<класс, объект этого класа>

Хранит сылки на объекты по ключу – классу объекта

Обертка над картой

1. Проверяет, что служба в единственном экземпляре,даже если служба не singleton

2. Содержит ссылки на множество служб, которые могут понадобиться методам объектов процесса

3. Позволяет создать только те объекты, которые нужны процессу

4. Список нужных служб можно хранить в конфиге

Page 7: Java осень 2013 лекция 6

Context

7

Page 8: Java осень 2013 лекция 6

План лекции

8

1. Singleton и Context

2. Exception и Throwable

3. Events и Callbacks

4. Анонимные классы

5. Random

6. Time и Date

7. I/O streams

8. VFS

Page 9: Java осень 2013 лекция 6

Задачи исключений

9

«второй» способ выхода из функции

возможность вернуть код ошибки

«проброс» данных через call stack

уведомление вызывающей стороны о не корректных данных

уведомление о состоянии которое код не может исправить

Page 10: Java осень 2013 лекция 6

Пример

10

Варианты результата вызова функции:

значение

null

exception

Рассмотрим функцию чтения id по имени из базы

public Integer getId(String name){…}

Page 11: Java осень 2013 лекция 6

Throwable

11

Page 12: Java осень 2013 лекция 6

Наследование

12

Page 13: Java осень 2013 лекция 6

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)…

}

Page 14: Java осень 2013 лекция 6

Пример использвания

14

Page 15: Java осень 2013 лекция 6

План лекции

15

1. Singleton и Context

2. Exception и Throwable

3. Events и Callbacks

4. Анонимные классы

5. Random

6. Time и Date

7. I/O streams

8. VFS

Page 16: Java осень 2013 лекция 6

Events

16

Задача

Служба в которой происходят некоторые события – EventSource

Службы которые должны реагировать на эти события – EventListeners

Нужен механизм оповещения о событии и передачи инфорации об источнике

Реализация

EventSource

EventListenerInterface

EventListenerImpl

Page 17: Java осень 2013 лекция 6

Pattern Observer

17

Page 18: Java осень 2013 лекция 6

Event listener

18

Page 19: Java осень 2013 лекция 6

Event source

19

Page 20: Java осень 2013 лекция 6

Примеры подписок

20

Старт сервера

События игрового мира

Вход/выход пользователя на карту

Наступление определенного момента времени

Page 21: Java осень 2013 лекция 6

Задача

Реализация

Callback

21

Вы используете внешнюю библиотеку

Событие во внешней библиотеке должно повлиять на ваш код

Ваш метод который будет вызван по событию – callback

Вы должны передать в библиотеку свой метод

С++: ссылка на функцию

С#: делегаты

Java: вы передаете объект реализующий библиотечный интерфейс

Page 22: Java осень 2013 лекция 6

Callback

22

Пример:

Page 23: Java осень 2013 лекция 6

План лекции

23

1. Singleton и Context

2. Exception и Throwable

3. Events и Callbacks

4. Анонимные классы

5. Random

6. Time и Date

7. I/O streams

8. VFS

Page 24: Java осень 2013 лекция 6

Если вы передаете в метод новый объект класса по интерфейсу,не обязательно создавать отдельный класс.

Анонимные классы

24

Явное создание класса

Page 25: Java осень 2013 лекция 6

Точно также можно создать анонимный наследник абстрактного класса

Анонимные классы

25

Анонимный класс

Page 26: Java осень 2013 лекция 6

План лекции

26

1. Singleton и Context

2. Exception и Throwable

3. Events и Callbacks

4. Анонимные классы

5. Random

6. Time и Date

7. I/O streams

8. VFS

Page 27: Java осень 2013 лекция 6

Pseudorandom number generator — алгоритм, порождающий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению

Нет понятия случайного числаЕсть последовательности чисел с заданным распределением

Random

27

Page 28: Java осень 2013 лекция 6

Алгоритм случайности

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

Page 29: Java осень 2013 лекция 6

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

Page 30: Java осень 2013 лекция 6

…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

Page 31: Java осень 2013 лекция 6

План лекции

31

1. Singleton и Context

2. Exception и Throwable

3. Events и Callbacks

4. Анонимные классы

5. Random

6. Time и Date

7. I/O streams

8. VFS

Page 32: Java осень 2013 лекция 6

Time & Date

32

Работа со временем

Работу со временем лучше перенести в TimeHelper

От миллисекунд до даты

UNIX или POSIX time – время с 1 января 1970 в секундах

Фарматирование даты и времени для пользователей

Как хранить время в приложении и в базе

Подписка на таймер

Page 33: Java осень 2013 лекция 6

TimeHelper

33

Page 34: Java осень 2013 лекция 6

Timer

34

java.unil.Timer

java.unil.TimerTask

Порядок работы:

Создаем timer

Создаем класс унаследованный от TimerTask

Пишем в методе run() код, который будет выполнен по таймеру

Передаем в timer таск и время, через которое надо выполнить таск

Ждем положенное время

PROFIT!!!

Выключаем timer через timer.cancel();

Page 35: Java осень 2013 лекция 6

Timer

35

Page 36: Java осень 2013 лекция 6

План лекции

36

1. Singleton и Context

2. Exception и Throwable

3. Events и Callbacks

4. Анонимные классы

5. Random

6. Time и Date

7. I/O streams

8. VFS

Page 37: Java осень 2013 лекция 6

I/O ― общение с внешними устройствами (файлы, принтеры, сеть и т.д.)

Поток ― объект который представляет источник или приемник данных

Поток основан на последовательности битов данных

I/O, потоки

37

InputStream

OutputStream

Page 38: Java осень 2013 лекция 6

Основная задача ― читать байт за байтом из входного потока

Основные методы:

abstract int read()

int read(byte[] b)

void mark(int readlimit)

void reset()

void close()

public abstract class InputStream

InputStream

38

Page 39: Java осень 2013 лекция 6

Byte Streams

39

OutputStream

InputStream

PrintStream

FilterOutputStream BufferedOutputStream

DataOutputStream

FileInputStream

FilterInputStream

FileOutputStream

BufferedInputStream

DataInputStream

Page 40: Java осень 2013 лекция 6

Переопределяет все методы InputStream вызывая методы поля in

Наследники этого класса могут менять работу потока в поле in

Decorator pattern

FilterInputStream

40

Page 41: Java осень 2013 лекция 6

Decorator

41

Page 42: Java осень 2013 лекция 6

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();

Page 43: Java осень 2013 лекция 6

Character Streams

43

Page 44: Java осень 2013 лекция 6

SimpleFileReader

44

Page 45: Java осень 2013 лекция 6

CustomFileReader

45

Page 46: Java осень 2013 лекция 6

Закрытие потоков

Для особождения ресурсов все потоки должны быть закрыты

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

Page 47: Java осень 2013 лекция 6

File ― представление пути к файлу или директории

Скрывает от приложения детали пути к файлу конкретной ОС

File

47

Основные методы

boolean exists();

String getAbsolutePath();

boolean isDirectory();

boolean createNewFile();

boolean mkdir();

boolean delete();

boolean deleteOnExit();

Page 48: Java осень 2013 лекция 6

План лекции

48

1. Singleton и Context

2. Exception и Throwable

3. Events и Callbacks

4. Анонимные классы

5. Random

6. Time и Date

7. I/O streams

8. VFS

Page 49: Java осень 2013 лекция 6

VFS

49

Virtual File System ― модуль для работы с файлами

Page 50: Java осень 2013 лекция 6

VFS

50

Page 51: Java осень 2013 лекция 6

Iterator<String>

51

Page 52: Java осень 2013 лекция 6

Спасибо за внимание

Виталий Чибриков[email protected]