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

Preview:

Citation preview

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

на 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

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

Виталий Чибриковchibrikov@corp.mail.ru