Не секрет, что многие Java-программисты, начиная свой путь в индустрии, уделяют большое внимание «тяжелым» технологиям — OpenJPA, Spring, JAX-RS, EJB, WS-*,… Это дает возможность как скорее влиться в современные корпоративные проекты, так и максимизировать скорость роста зарплаты.
Многие из них в конце концов «спускаются» до технологий лежащих в основе указанных фреймворков — JDBC, Servlet API, NIO/NIO.2. Однако прискорбно, что зачастую не остается время на детальное изучение самого языка и возможностей платформы.
Речь идет не о тонкостях или экзотике, а о том, что составляет существенную часть работы фреймворка: Servlet-контейнер использует множественные ClassLoader-ы, JPA2-провайдер использует манипулирование байткодом, абсолютное большинство библиотек используют Reflection API, всеобщее использование Generics только «усугубилось» с появлением функциональных интерфейсов (java.lang.function.*) и лямбд.
На недопонимание изначальной платформы (ClassLoader, Reflection API) накладываются «новвоведения» Java 5 (Generics), а теперь еще и Java 8 (методы в интерфейсах, ссылки на методы, лямбды, Stream API, JSR 308: Pluggable Type Systems). Надо обратить внимание на то, что Generics + Java 8 — это не просто языковые фичи, это частично переход к функциональному стилю программирования.
Я собрал определенное количество полезных (на мой взгляд) ссылок по следующим темам
- Методы в интерфейсах, ссылки на методы, множественное наследование
- Лямбды (Project Lambda)
- Stream API
- Функциональные алгоритмы
- Аннотации
- Генерики
- Reflection API
- Загрузка классов
Надеюсь кто-то сочтет их полезными.
Детальная информация
- Методы в интерфейсах, ссылки на методы, множественное наследование
- Статические методы в интерфейсах
- Методы по умолчанию (default methods) в интерфейсах
- Как жить с множественным наследованием: возможности, разрешение конфликтов
- Ссылки на методы
- docs.oracle.com: Default Methods
- oracle.com/JavaTutorial: Method References
- Lambda Expressions in Java. Reference (pages 117-124, 135-147)
- Лямбды (Project Lambda)
- Предыстория, синтаксис лямбд
- Детали: lexical scope, effectivelly final, closures, type inference, target typing, сериализация лямбд
- docs.oracle.com: Lambda Expressions
- Lambda FAQ
- Java 8: Lambdas, Part 1
- Java 8: Lambdas, Part 2
- Lambda Expressions in Java. Tutorial
- Lambda Expressions in Java. Reference
- Stream API
- Внешняя и внутренняя итерация: map, filter, forEach
- Более сложные операции: flatMap, reduce, collect
- Свойства потоков и свойства операций: immediate/terminal, lazy/eager, stateless/stateful, short-circuiting, serial/parallel, ordered/unordered, associative
- Параллельные Stream-ы и неявная интеграция с Fork/Join
- docs.oracle.com: Aggregate Operations
- docs.oracle.com: Reduction
- docs.oracle.com: Parallelism
- javadoc: java.util.stream package description
- State of the Lambda (September 2013)
- State of the Lambda: Libraries Edition (September 2013)
- Interface evolution via virtual extension methods
- What’s Wrong with Java 8: Currying vs Closures
- What’s Wrong in Java 8, Part II: Functions & Primitives
- What’s Wrong in Java 8, Part III: Streams and Parallel Streams
- What’s Wrong in Java 8, Part IV: Monads
- What’s wrong in Java 8, part V: Tuples
- What’s wrong in Java 8, part VI: Strictness
- Функциональные алгоритмы
- Параллельная редукция работает на моноидах (ассоциативностью, нейтральный элемент). Что это значит?
- Optional, CompletableFuture,… и другие монады. Что это значит?
- Карринг, функции высшего порядка. Что это значит?
- Комбинаторные алгоритмы на Java 8
- Аннотации
- Определяем свои аннотации
- Мета-аннотации: @ Target, @ Retention, @ Inherited, @ Repeatable, ...
- Аннотации для компилятора: @ Override, @ SafeVarargs,@ SuppressWarnings, @ FunctionalInterface, ...
- Вычитываем аннотации при помощи Reflection API
- JSR 308: Type Annotations and Pluggable Type Systems
- Расширяем проверку типов с помощью Checker Framework: @ NotNull, @ GuardedBy, ...
- Генерики
- Bounded type parameters
- Self-bounding generics
- Wildcards
- Как реализованы в Java, ограничения (type erasure, bridge methods, non-reifiable types)
- docs.oracle.com: Generics
- Adding Wildcards to the Java Programming Language
- Making the future safe for the past: Adding Genericity to the JavaTM Programming Language
- Generics in the Java Programming Language
- Adding Generics to the Java Programming Language
- Java Generics FAQs
- Java Generics and Collections
- Reflection API
- java.lang.reflect
- Как framework-и используют Reflection API (JUnit, Mockito, Servlet API 3)
- docs.oracle.com: The Reflection API
- Java Reflection in Action
- Mirrors: Design Principles for Meta-level Facilities of Object-Oriented Programming Languages
- Загрузка классов
- Формат class-файла и процедура загрузки классов (load, link (verify, prepare, resolve), init)
- ClassLoader: определяем свой загрузчик, строим иерархию загрузчиков
- Динамическая кодогенерация, компилируем “на лету”: Compiler API, javaassist
- Динамическая кодогенерация, собираем из байткода: BCEL, cglib
- Динамическая кодогенерация, трансформация существующего байткода в процессе загрузки классов
- Dynamic Class Loading in the Java Virtual Machine
- Internals of Java Class Loading
- Inside Class Loaders
- Inside Class Loaders: Debugging
- Java Lang Spec: Loading of Classes and Interfaces
- Java Lang Spec: Linking of Classes and Interfaces
- Java Lang Spec: Initialization of Classes and Interfaces
- Java Lang Spec: Unloading of Classes and Interfaces
Вебинары
5 августа стартует серия из 8-ми вебинаров по темам, указанным выше. Вебинары длятся 2.5-3 часа, в течении которых удается глубоко погрузится в проблематику и детали. Занятия проходят 2 раза в неделю в течении 4-х недель во вторник и пятницу в 18.00-21.00 по московскому времени.
Стоимость
При оплате до 12 июля: 225$.
При оплате до 19 июля: 250$.
При оплате до 26 июля: 275$.
При оплате после 26 июля: 300$.
Контакты
email: GolovachCourses
skype: GolovachCourses
Автор: IvanGolovach