Java весна 2013 лекция 6
-
Upload
technopark -
Category
Technology
-
view
157 -
download
0
Transcript of Java весна 2013 лекция 6
![Page 1: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/1.jpg)
Углубленное программирование на JavaЛекция 6. «Утилиты»
Виталий Чибриков
![Page 2: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/2.jpg)
2
base
dbService
Схема сервера
utils
messageSystem
frontend
main
gameMechanics
resourceSystem
![Page 3: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/3.jpg)
3
План лекции
3. Events и Callbacks
7. I/O streams
5. Random
1. Singleton и Context
4. Анонимные классы
6. Time и Date
8. VFS
2. Exception и Throwable
![Page 4: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/4.jpg)
4
Singleton
Позволяет создать только один объект данного типа на процесс
Аналог статического поля, с «отложенной» инициализацией
Singleton
Содержит приватное статическое поле типа своего же класса (instance)
Приватный конструктор
Статический метод instance() который возвращает instance класса
![Page 5: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/5.jpg)
5
Singleton
public class Singleton {private static Singleton singleton;
public static Singleton instance(){if(singleton == null){
singleton = new Singleton();}return singleton;
}
private Singleton(){}}
![Page 6: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/6.jpg)
6
Context
Map<класс, объект этого класа>
3. Позволяет создать только те объекты, которые нужны процессу
4. Список нужных служб можно хранить в конфиге
Хранит сылки на объекты по ключу – классу объекта
Обертка над картой
1. Проверяет, что служба в единственном экземпляре,даже если служба не singleton
2. Содержит ссылки на множество служб, которые могут понадобиться методам объектов процесса
![Page 7: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/7.jpg)
7
Context
public class Context {private Map<Class<?>, Object> context = new HashMap<Class<?>, Object>();
public void add(Class<?> clazz, Object object){if(context.containsKey(clazz)){
//ERROR}context.put(clazz, object);
}
public Object get(Class<?> clazz){return context.get(clazz);
}}
![Page 8: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/8.jpg)
8
План лекции
3. Events и Callbacks
7. I/O streams
5. Random
1. Singleton и Context
4. Анонимные классы
6. Time и Date
8. VFS
2. Exception и Throwable
![Page 9: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/9.jpg)
9
Задачи исключений
«второй» способ выхода из функции
возможность вернуть код ошибки
«проброс» данных через call stack
уведомление вызывающей стороны о не корректных данных
уведомление о состоянии которое код не может исправить
![Page 10: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/10.jpg)
10
Пример
public Integer getId(String name){…}
Варианты результата вызова функции:
значение
null
exception
Рассмотрим функцию чтения id по имени из базы
![Page 11: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/11.jpg)
11
Throwable
public class Throwable
private StackTraceElement[] stackTrace = UNASSIGNED_STACK
private String detailMessage
private Throwable cause = this
public String getMessage()
public void printStackTrace()
public Throwable getCause()
![Page 12: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/12.jpg)
12
Наследование
![Page 13: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/13.jpg)
13
Exception
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](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/14.jpg)
14
Пример использвания
public void setIdFromName(String name){try{
userId = getId(name);} catch(GMException e){
log.error(e.getMessage());}
}
private int getId(String name) throws GMException{DatabaseManager manager = context.get(DatabaseManager.class);if(manager == null){
throw new GMException(“Can’t find DBManager”);}return manager.readId(name);
}
![Page 15: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/15.jpg)
15
План лекции
3. Events и Callbacks
7. I/O streams
5. Random
1. Singleton и Context
4. Анонимные классы
6. Time и Date
8. VFS
2. Exception и Throwable
![Page 16: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/16.jpg)
16
Events
Задача
Служба в которой происходят некоторые события – EventSource
Службы которые должны реагировать на эти события – EventListeners
Нужен механизм оповещения о событии и передачи инфорации об источнике
Реализация
EventSource
EventListenerInterface
EventListenerImpl
![Page 17: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/17.jpg)
17
Pattern Observer
![Page 18: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/18.jpg)
18
Event listener
public interface EventListener { public void handle(EventObject event);}
public class EventListenerImpl implements EventListener {
//code
public void handle(...){ //process event}
}
![Page 19: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/19.jpg)
19
Event source
public class EventSource {private List<EventListener> listeners = new LinkedList<EventListener>(); public void addListener(EventListener listener){
listeners.add(listener);} public void removeListener(EventListener listener){
listeners.remove(listener); }
public void fireEvent(){for(MyEventListener listner : listeners){
listner.handle(...);}
}}
![Page 20: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/20.jpg)
20
Примеры подписок
Старт сервера
События игрового мира
Вход/выход пользователя на карту
Наступление определенного момента времени
![Page 21: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/21.jpg)
21
Callback
Задача
Вы используете внешнюю библиотеку
Событие во внешней библиотеке должно повлиять на ваш код
Ваш метод который будет вызван по событию – callback
Реализация
Вы должны передать в библиотеку свой метод
С++: ссылка на функцию
С#: делегаты
Java: вы передаете объект реализующий библиотечный интерфейс
![Page 22: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/22.jpg)
22
Callback
Пример:
class HelloWorld extends AbstractHandler { //из примера jetty
public void handle(...) { //это callback
![Page 23: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/23.jpg)
23
План лекции
3. Events и Callbacks
7. I/O streams
5. Random
1. Singleton и Context
4. Анонимные классы
6. Time и Date
8. VFS
2. Exception и Throwable
![Page 24: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/24.jpg)
24
Анонимные классы
Если вы передаете в метод новый объект класса по интерфейсу,не обязятельно создавать отдельный класс.
Явное создание классаinterface A{ //библиотечный интерфейс
handle(); //callback}
class Aimpl implements A{ //реализация интерфейсаhandle(){…}
}
class B{static void proccessA(A a){…} //вызов callback-a в библиотеке
static void main(String[] args){B.proccessA(new AImpl()); //передача реализации в библиотеку
}}
![Page 25: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/25.jpg)
25
Анонимные классы
interface A{ //библиотечный интерфейс handle(); //callback
}
class B{static void proccessA(A a){…} //вызов callback-a в библиотеке
static void main(String[] args){B.proccessA(new A (){ //передача реализации в библиотеку
handle(){…} //анонимный класс
});}
}
Анонимный класс
Точно также можно создать анонимный наследник абстактного класса
![Page 26: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/26.jpg)
26
План лекции
3. Events и Callbacks
7. I/O streams
5. Random
1. Singleton и Context
4. Анонимные классы
6. Time и Date
8. VFS
2. Exception и Throwable
![Page 27: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/27.jpg)
27
Random
Нет понятия случайного числа
Есть последовательности чисел с заданным распределениемPseudorandom number generator — алгоритм, порождающий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению
![Page 28: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/28.jpg)
28
Алгоритм случайности
Linear Congruential Pseudorandom Number Generator (See Donald Knuth, The Art of Computer Programming, Volume 3, Section 3.2.1.)
java.util.Random
modulus
incrementmultiplier
seed
![Page 29: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/29.jpg)
29
Random in java
Random rnd = new Random();rnd.nextInt(100); – вернет случайное число от 0 до 100При каждом запуске последовательность будет новойRandom rnd = new Random(1L);rnd.nextInt(100); – вернет случайное число от 0 до 100При каждом запуске последовательность будет прежней
Math.random(); – вернет случайное число типа double от 0 до 1При каждом запуске последовательность будет новой
![Page 30: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/30.jpg)
30
Субъективная случайность
…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)
Видео (Sid Meier GDC 2010):
http://www.youtube.com/watch?v=bY7aRJE-oOY
![Page 31: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/31.jpg)
31
План лекции
3. Events и Callbacks
7. I/O streams
5. Random
1. Singleton и Context
4. Анонимные классы
6. Time и Date
8. VFS
2. Exception и Throwable
![Page 32: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/32.jpg)
32
Time & Date
Работа со временем
Работу со временем лучше перенести в TimeHelper
От миллисекунд до даты
UNIX или POSIX time – время с 1 января 1970 в секундахФарматирование даты и времени для пользователей
Как хранить время в приложении и в базе
Подписка на таймер
![Page 33: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/33.jpg)
33
TimeHelper
public class TimeHelper {
public static long getTimeInMs(){Date date = new Date();return date.getTime();
}
public static int getPOSIX(){Date date = new Date();int millisInSecond = 1000;return (int)(date.getTime() / millisInSecond);
}
public static String getUserDateFull(Locale locale){Date date = new Date();DateFormat dateFormatter =
DateFormat. getDateInstance(DateFormat.FULL, locale);return dateFormatter.format(date);
}}
![Page 34: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/34.jpg)
34
Timer
java.unil.Timer
java.unil.TimerTask
Порядок работы:
Создаем timer
Создаем класс унаследованный от TimerTask
Пишем в методе run() код который будет выполнен по таймеру
Передаем в timer таск и время через кторое надо выполнить таск
PROFIT!!!
Выключаем timer через timer.cancel();
Ждем положенное время
![Page 35: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/35.jpg)
35
Timer
int timeMs = 10000;TimeService.instance().start();TimeService.instance().sheduleTask(new TimerTask(){
public void run() {System.out.append("Timer run!\n");TimeService.instance().stop();
}
}, timeMs);
![Page 36: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/36.jpg)
36
План лекции
3. Events и Callbacks
7. I/O streams
5. Random
1. Singleton и Context
4. Анонимные классы
6. Time и Date
8. VFS
2. Exception и Throwable
![Page 37: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/37.jpg)
37
I/O, потоки
I/O ― общение с внешними устройствами (файлы, принтеры, сеть и т.д.)
Поток ― объект который передставляет источник или приемник данных
Поток основан на последовательности битов данных
InputStream
OutputStream
![Page 38: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/38.jpg)
38
InputStream
public abstract class InputStream
Основные методы:
abstract int read()
int read(byte[] b)
void mark(int readlimit)
void reset()
void close()
Основная задача ― читать байт за байтом из входного потока
![Page 39: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/39.jpg)
39
Byte Streams
OutputStream
InputStream
PrintStream
FilterOutputStream
BufferedOutputStream
DataOutputStream
FileInputStream
FilterInputStream
FileOutputStream
BufferedInputStream
DataInputStream
![Page 40: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/40.jpg)
40
FilterInputStream
public class FilterInputStream extends InputStream
Переопредляет все методы InputStream вызывая методы поля in
private InputStream in;
protected FilterInputStream(InputStream in){this.in = in;
}
Наследники этого класса могут менять работу потока в поле in
Decorator pattern
![Page 41: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/41.jpg)
41
Decorator
![Page 42: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/42.jpg)
42
Decorator
Рассмотрим сериализованные 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](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/43.jpg)
43
FileWriter
FileReader
Character Streams
Writer
Reader
BufferedWriter
OutputStreamWriter
PrintWriter
BufferedReader
InputStreamReader
![Page 44: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/44.jpg)
44
SimpleFileReader
public class SimpleFileReader {public static void main(String args[]) throws IOException {
FileReader fr = new FileReader("SimpleFileReader.java"); BufferedReader br = new BufferedReader(fr); String currentLine; while((currentLine = br.readLine()) != null) {
System.out.println(currentLine);} fr.close();
} }
![Page 45: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/45.jpg)
45
CustomFileReader
public class CustomFileReader {public static void main(String args[]) throws IOException {
FileInputStream fstream = new FileInputStream("textfile.txt");DataInputStream in = new DataInputStream(fstream); InputStreamReader isr = new InputStreamReader(in, "UTF-16");BufferedReader br = new BufferedReader(isr);
String strLine;
while ((strLine = br.readLine()) != null) {System.out.println (strLine);
} br.close();
}}
![Page 46: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/46.jpg)
46
Закрытие потоков
Для особождения ресурсов все потоки должны быть закрыты
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());
}}
}
![Page 47: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/47.jpg)
47
File
File ― представление пути к файлу или директории
Скрыает от приложения детали пути к файлу конкретной ОС
Основные методы
boolean exists();
String getAbsolutePath();
boolean isDirectory();
boolean createNewFile();
boolean mkdir();
boolean delete();
boolean deleteOnExit();
![Page 48: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/48.jpg)
48
План лекции
3. Events и Callbacks
7. I/O streams
5. Random
1. Singleton и Context
4. Анонимные классы
6. Time и Date
8. VFS
2. Exception и Throwable
![Page 49: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/49.jpg)
49
VFS
Virtual File System – модуль для работы с файлами
public interface VFS {
boolean isExist(String path);
boolean isDirectory(String path);
String getAbsolutePath(String file);
byte[] getBytes(String file);
String getUFT8Text(String file);
Iterator<String> getIterator(String startDir);
}
![Page 50: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/50.jpg)
50
VFS
public class VFSImpl implements VFS {
private String root;
public VFSImpl(String root){this.root = root;
}
…}
![Page 51: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/51.jpg)
51
Iterator<String>
private class FileIterator implements Iterator<String>{
private Queue<File> files = new LinkedList<File>();
public FileIterator(String path){files.add(new File(root + path));
}public boolean hasNext() {
return !files.isEmpty();}public String next() {
File file = files.peek();if(file.isDirectory()){
for(File subFile : file.listFiles()){files.add(subFile);
}}return files.poll().getAbsolutePath();
}public void remove() {}
}
![Page 52: Java весна 2013 лекция 6](https://reader036.fdocuments.net/reader036/viewer/2022062312/555c3d92d8b42a2c068b4b65/html5/thumbnails/52.jpg)
52
Билеты
23. Работа со случайными числами
24. Паттерны проектирования: Singleton и Context
25. Events. Подписка на события
26. Передача функции в библиотеку. Callback
27. Анонимные классы
28. Работа со временем и датой. Unix time. Locale
29. I/O Streams. Потоки байт и потоки символов
30. Исключения: Throwable, Error, Exception, try, catch, finally