Курсы: Технопарк
Преподаватель: Виталий Чибриков
И так, вторая лекция. Делаем аутентификацию пользователя.
1. Задача
Сделать authentication
Упрощения:
- Без записи в БД (все данные храняться в памяти)
- Без интерфейсов (добавим интерфейсы, когда будем добавлять тестирование)
- Потоками уравляет Jetty (система уже многопоточная)
- “Потокоопасные” карты (но потобезопасные контейнеры мы использовать не будем, т.к. вероятность коллизий крайне мала)
P.S. Для тех кто пришел сюда как и я с опытом интепретируемых языков (например PHP). Для меня было просто настоящим открытием, что данные можно хранить не в базе, а в памяти, т.к. я не привык работать с программой, которая работает дольше одного запроса от пользователя. Рекомендую почитать PHP создан, чтобы умирать
2. Generics (24:10)
Generic programming – тип перменной как параметр
- Проверка типов при компиляциии
- Меньше кода
Пример класса с параметром
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class GenericExample<T> { private T value; public GenericExample(T value); this.value = value; } public T getT() { return value; } public static void main(String[] args) { GenericExample<Integer> intObject = new GenericExample<Integer>(1); Integer valueInteger = intObject.getT(); GenericExample<String> stringObject = new GenericExample<String>("world"); String valueString = stringObject.getT(); } } |
Метод с параметром
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class GenericExample { public static <T> T getTheFirst(List<T> list) { return list.get(0); } public static void main(String[] args) { List<Integer> listOfInts = new ArrayList<Integer>(); listOfInts.add(0); Integer intValue = getTheFirst(listOfInts); List<String> listOfStrings = new ArrayList<String>(); listOfStrings.add("Java is the best!"); String stringValue = getTheFirst(listOfStrings); } } |
Пример пользы Generics
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static Object getFirstValue(List list){ return list.get(0); } public static String getFirstStringValue(List<String> listofStrings){ return listOfStrings.get(0); } public static void main(String[] args){ List<Integer> listOfNumbers = new ArrayList<Integer>(); listOfNumbers.add(42); String name1 = (String) getFirstValue(listOfNumbers); //Runtime error String name2 = getFirstStringValue(listOfNumbers); //Compile error } |
Краткое пояснение:
- Мы создаем List Integer
- Добавляем туда 1 элемент (42)
- Используем статическую функцию getFirstValue
- getFirstValue, которая принимает просто List, без уточнений, и возвращает Object. Эта функция благополучно съедаем наш List
- Пытаемся скастить (преобразовать) Object (который на самом деле Integer) к String. И получаем Runtime error. Плохо то, что на этапе компиляции мы не знали про эту ошибку
- Используем функцию getFirstStringValue
- Сразу получаем ошибку компиляции, т.к. эта функция принимает только List из String
Нам php’шникам вообще не привыкать. Мы вообще не знаем, что такое компилятор. Это у джавистов тонкая душа )) Им некогда дебажить им надо кодить. Поэтому и кода на java больше.
[Не воспринимайте всерьез]
Еще пару примеро синтаксиса:
1 2 3 4 5 |
void printCollection(List<?> collection) {...}; void drawShape(List<? extends Shape> shapes) {...}; void foo(List<? super Integer> bar) {...}; |
Generics существуют только ДО компиляции
В байткоде используется Object, я так понимаю, что потом кастится
Generics VS Inheritance
Hack от Технопарка
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class LongId<T> { private long id; public LongId(long id) { this.id = id; } public long getLong() { return id; } } public void manyIdsInParams(long userId, long serverId, long address) {...} // bad public void manyIdsInParams(LongId<User> userId, LongId<Server> serverId, LongId<Address> address) {...} |
3. Коллекции и карты (59:20)
- Список с очередностью
- LinkedList – быстрое удаление и добавление элементов
- ArrayList – быстрый доступ по индексу
Set
- Без очередности
- Без индекса
- Быстрый поиск элемента
Queue
- FIFO
4. HttpSession (01:15:50)
Ничего лишнего:
1 2 3 4 5 6 7 8 9 |
HttpSession session = request.getSession(); Long userId = (Long) session.getAttribute("userId"); if(userId == null) { userId = userIdGenerator.getAndIncrement(); session.setAttribute("userId", userId); } String key = session.toString(); |