Вступительная лекция по Java. История появления, идеи, сферы применения, место среди других языков, экосистема. Структурированная информация о Java, как о языке программирования.
Под эту лекцию имеется более развёрнутый материал. Кому интересно - пишите.
Конструктивная критика приветствуется.
1. Java
вчера, сегодня, завтравчера, сегодня, завтра
- большая обзорная лекция -- большая обзорная лекция -
Ставила Леонид
27 марта 2017
mondaymonday
2. Краткое содержание
История появления и развития Java
Идеи, лежащие в основе языка
Сферы применения
Сильные и слабые стороны
Место среди других языков
Экосистема Java
3. Язык Java
Промышленный, строго типизированный,
объектно-ориентированный
Sun Microsystems, 1991
Джеймс Гослинг
Greentalk → Oak → Java
Для бытовой электроники со слабой
аппаратной начинкой.
4. Требования к новому языку
Независимость от платформы
Высокая надёжность
Компактность
5. Некоторые факты
Официальный анонс: 1995-й год
Первая версия: 1996-й год
Синтаксис взят из C++, но проще
Долгая разработка, почему?
Разное железо, отделили язык
6. Нелёгкий старт
Одна целевая платформа == +1 JVM
Не продолжение C++
Сборщик мусора, компактность,
распределённость, многопоточность
Отсутствие интереса к платформе
Pascal, UNIX
7. Язык для Web
Собственный браузер HotJava
Поддержка Java в Netscape
Популярность росла вместе с интернетом
10. Виртуальная машина
Плюсы:
Байт-код независим от операционной
системы и железа. Один и тот же код
одинаково работает в Windows и Linux.
Контроль выполнения программы, запрет
потенциально опасных операций.
Минусы:
Страдает производительность. Решается
компиляцией байт-кода в машинный код,
так называемая JIT-компиляция.
11. Виртуальная машина
Настоящее произведение искусства
Очень производительная
Ах, как хороша
Для JVM адаптировано более 20 языков: Groovy,
Clojure, Scala, Kotlin, JRuby, Jython, ...
убийцы
12. Виртуальная машина
Классические JVM: Windows, Linux, Mac OS,
начиная с 7-й версии и Solaris
В мобилках из 2000-х, включая Symbian свои
В Blue-ray устройствах и всяких железяках свои
В устройствах, под управлением Android
собственная виртуальная машина - Dalvik и его
преемница - Android Runtime
Разнообразные сторонние разработки
13.
Название языка происходит от марки
кофе.
Другая версия утверждает, что это
отсылка к кофе-машине, одному из
приборов, для которого это язык и
разрабатывался.
Язык мог и до нашего
времени называться
«Дубом», но эта торговая
марка уже была
зарегистрирована.
15. Простота
Синтаксически Java очень напоминает Си
Не надо привыкать к очередному
чудаковатому синтаксису
Нет указателей, перегрузки операторов,
оператора goto, конструкций struct и union.
Упрощён насколько было возможно, но не в
ущерб функциональности
Более чем вдвое сокращает разработку, в
сравнении с C++
16. Объектная
ориентированность
Всё может быть объектом. Объект это данные
и методы, изменяющие эти данные в одной
упаковке.
ООП - не панацея. Временами не хватает
процедурного или функционального
программирования. Например, для запуска
Java программы метод main() приходится
вписывать в класс. Это громоздко.
Функциональные возможности в виде лямбда-
выражений были добавлены в Java 8.
Существительное, глагол
17. Распределённость
На Java можно писать приложения для:
различных платформ
операционных систем
графических интерфейсов пользователя
Java так же предназначен для поддержки
сетевых приложений. Таким образом он
широко используется как инструмент
разработки в среде подобной Internet, где
существуют различные платформы.
Файл на
удалённом
ПК
18. Устойчивость
Код Java должен одинаково хорошо работать
на различных экзотических платформах.
Следовательно, он должен быть очень
устойчив.
Решения:
Строгая типизация
Отсутствие указателей
Отсутствие прямой работы с памятью
Сборщик мусора
Механизм обработки исключений
Компиляция, = ==, & &&, выполнение
19. Безопасность
В Java и JVM несколько уровней защиты.
На уровне языка:
Объекты. Разрешается использоваться только
объявленные методы с соответствующим
уровнем видимости. Инкапсуляция
Отсутствие прямого доступа к памяти
Проверка массивов на переполнение
На уровне компилятора и интерпретатора:
Песочница для подозрительных приложений
Ограничение доступа к некоторым ресурсам
Вирусы в 90-е
инициализация
20. Независимость от системы
Код Java (.java)Код Java (.java)
Компилятор
JAVAC
Компилятор
JAVAC
Байт-код (.class)Байт-код (.class)
JVMJVM JVMJVM
WindowsWindows LinuxLinux MacMac
JVMJVM
Код Java выполняется на различных
платформах: Windows, Linux, Mac OS и других.
Это достигается с помощью компиляции
и последующей
интерпретации кода.
1 платформа == 1 JVM
21. Компиляторы
Компиляторы Java очень продвинутые.
Они тщательно оптимизируют код
И даже выбрасывают ненужное
Байт-код будет выполнять в точности то,
что было запрограммировано, но, при
декомпиляции, исходный код не всегда
совпадает с тем, что написал программист.
тестирование
23. Интерпретируемость
Java - интерпретируемый язык.
Каждая команда интерпретируется в
машинный код во время выполнения
программы, а не во время компиляции.
На какой бы версии Java не был написан код,
после компиляции он превращается в
совершенно нейтральный байт-код, который
может интерпретировать любая другая
подходящая JVM.
24. Высокая эффективность
Язык Java разрабатывался с прицелом на
центральные процессоры с очень низким
энергопотреблением.
Байт-код Java тщательно продуман так, чтобы
его можно было очень эффективно
транслировать в машинный код.
Современные компиляторы, JIT
25. Многопоточность
●
Встроенная поддержка многопоточности
позволяет выжимать больше
производительности из процессоров и
организовывать работу интерактивных
приложений.
●
В стандартных библиотеках имеются
средства контроля доступа к совместно
используемым данным.
26. Динамичность
Java - динамический язык программирования.
Программы Java во время выполнения могут
возвращать много полезной информации, что
позволяет динамически безопасно связать код,
или получать какие-то данные об объектах и их
методах при помощи рефлексии.
27. История развития Java
Первая версия: 23 января 1996-го года, Oak
Стабильная версия JDK 1.0.2 == Java 1
Что из спецификации Oak не попало в Java?
Беззнаковые примитивные типы
Перечисления (+ в Java 5)
Ключевое слово assert (+ в Java 1.4)
Различия:
Абстрактные методы в стиле C++
Другие области видимости. Нет эквивалента private
Все исключения не проверяемые
Дополнительные условия для переменных класса
Определение условий для методов notnull
28. JDK 1.1
19.02.1997
Переписана модель событий AWT
Внутренние классы
JavaBeans
JDBC
Вызов удалённых методов
Рефлексия (только анализ кода)
Компилятор JIT (Just In Time) для Windows
стандарт взаимодействия с различными СУБД SQL
29. J2SE 1.2 (Playground)
08.12.1998
Java разделили на 3 линейки. Говорим о:
Java 2 Platform, Standard Edition
На смену AWT пришёл Swing
Инфраструктура коллекций
Цифровые сертификаты
Java 2D
Drag-and-Drop
Полная поддержка Unicode
strictfp
31. J2SE 1.4 (Merlin)
06.02.2002
Ключевое слово assert
Регулярные выражения
Поддержка IPv6
NIO
Logging API
Image I/O API
XML парсер и XSLT процессор
Сцепленные исключения
Безопасность и криптография: JCE, JSSE, JAAS
Java Web Start
Preferences API (java.util.prefs)
Коллекции: несколько новых методов класса
Collections, интерфейс RandomAccess, классы
LinkedHashMap и IdentityHashMap
32. J2SE 5.0 (Tiger)
30.09.2004
Обобщения
Аннотации
Автоупаковка примитивных типов
Перечислимые типы (enum)
Методы с неопределённым числом параметров
Импорт статических методов и переменных
Цикл foreach
Комментарии javadoc
ProcessBuilder
Инструменты для изменения байт-кода методов во
время выполнения программы
Formatter, Scanner
Коллекции: новые интерфейсы Queue, BlockingQueue,
ConcurrentMap с несколькими реализациями, а так же
CopyOnWriteArrayList, CopyOnWriteArraySet, EnumSet,
EnumMap, несколько новых методов класса Collections
33. Java SE 6 (Mustang)
11.12.2006
Очень много улучшений существующих технологий
Поддержка скриптовых языков (JSR 223)
Заметно возросла скорость работы Swing и Java в
целом. Скорость вычислений на 70%, скорость
операций ввода-вывода возросла в два раза.
Swing лучше дружит с OpenGL и DirectX, поддержка GIF
JAX-WS - Java API for XML Web Services
Java Compiler API
Java HTTP Server
JAXB 2.0 и парсер StAX
Коллекции: новые интерфейсы Deque, BlockingDeque,
NavigableSet, NavigableMap, ConcurrentNavigableMap с
несколькими реализациями, несколько новых методов
класса Collections
34. Java SE 7 (Dolphin)
28.07.2011
Поддержка динамических языков на уровне JVM
Строковые параметры в switch
Автоматическое управление ресурсами (try-с-ресурсами)
Двоичные литералы
Знаки подчёркивания в числовых литералах
Параллельные утилиты, Fork/Join Framework
NIO 2.0
JavaFX
Конвейер XRender для Java 2D
Поддержка алгоритмов эллиптической криптографии
JVM для Solaris
Коллекции: новый интерфейс TransferQueue, улучшена
функция подсчёта хеш-кодов для некоторых коллекций
35. Java SE 8
18.03.2014
Лямбда-выражения
Методы по умолчанию в интерфейсах
Аннотации типов
Параллельная сортировка массивов
JavaScript в приложениях
Беззнаковая целочисленная арифметика
Date and Time API
Кодер/декодер Base64
Запуск JavaFX программ
JVM: упразднён Permanent Generation
Стримы и параллельные стримы для
обработки коллекций, совокупные операции.
36. Java SE 9
июль 2017
JSR 376: Модульность JDK (проект Jigsaw)
JEP 222: jshell: Java REPL
JEP 295: Компиляция перед исполнением «Graal»
JEP 268: XML-каталоги
Сжатые строки
HTTP-клиент с поддержкой HTTP 2.0, веб-сокетов
Обновление Process API для лучшего
взаимодействия с не-Java процессами
JEP 266: повезёт - увидим реактивные стримы
Так же есть планы добавить автоматический
параллелизм с OpenCL
37. Java SE 10
Ходят слухи об объектах без
идентификаторов, а так же массивах с 64-
битной адресацией.
●
JSR 354: Money and Currency API
(изначально планировали в Java 9)
39. Семейство Java
Начиная с J2SE разрабатывается несколько
линеек Java под разные сферы деятельности.
Java SE — основное издание Java: компиляторы, API,
JRE; подходит для создания пользовательских
приложений.
Java EE — спецификации для создания ПО уровня
предприятия.
Java ME — для мобильных телефонов, КПК,
встроенных систем, другой маломощной электроники
Java Card — для приложений, работающих на смарт-
картах и других устройствах с ограниченным объёмом
памяти и возможностями обработки.
40. Место Java
среди других языков
Рейтинг PYPL показывает частоту поиска в Google
документации по языкам. Тут Java явный лидер на
протяжении многих лет, и угроза видится только со стороны
Python.
41. GitHub
Топ-лист от GitHub ведёт статистику, начиная с
2008-го года. За первое место борются JavaScript и Java.
42. Code Eval
Code Eval собирает свою статистику, и согласно
их рейтинга за 2016-й год, лидеры Python и Java.
43. TIOBE
Рейтинг, составленный по данным поисковиков. Индекс
TIOBE основан на результатах подсчета поисковых
запросов, содержащих название языка (+"<language>
programming"). Он интересен главным образом потому,
что ведётся с 2001-го года. Java и C тут вне конкуренции,
хотя, для нашего времени на графике видно резкое
падение индекса обоих языков.
46. Другая статистика
Самые продаваемые книги: Java, JavaScript, C#
По результатам опроса программистов, текущие и
предпочитаемые языки: Java, C#, JavaScript
Можно рассмотреть с десяток рейтингов в табличном виде,
но это будет скучно.
Java за первые несколько лет своего развития стремительно
ворвался в тройку лидеров и до сих пор достаточно
уверенно держит свои позиции, возможно, даже и первое
место. И это при том, что Desktop направление не получило
должного развития, хотя, имеются и шедевры: Eclipse, IntelliJ
Idea, NetBeans, и, хит всех времён и
народов - Minecraft. Технология
апплетов вообще мертва, а новые и
востребованные возможности если
и появляются, то с задержками.
47. Где используется Java?
Основная популярность: полноценные
веб-приложения, корпоративный back-end, и, как это ни
удивительно, Desktop-приложения. К сожалению,
статистика не очень подробная, на ней не нашлось
места Big Data, и, конечно же, Android'у. Можно только
гадать. Так же нет информации, насколько широко Java
используется в бытовых приборах,
всевозможных датчиках и
встраиваемых системах, но,
судя по статьям в интернете,
и заявлениям Oracle –
используется,
причём крайне
успешно.
48. Цифры от Oracle
От портативных компьютеров до центров сбора данных,
от игровых консолей до суперкомпьютеров, используемых для
научных разработок, от сотовых телефонов до сети Интернет
— Java используется повсюду!
Java используется на 97% корпоративных настольных ПК
Java используется на 89% настольных ПК в США
9 млн разработчиков на Java в мире
Инструмент номер 1 среди разработчиков
Программа номер 1 среди разработчиков
Java используется в 3 млрд мобильных телефонов
Java входит в комплект поставки 100% всех проигрывателей
дисков Blu-ray
Используется 5 млн Java Card
Java используется в 125 млн ТВ-устройств
5 из 5 основных производителей оригинального оборудования
включают в комплект поставки Java ME
49. Критика Java
Следование принципу «написано однажды —
работает везде», а так же строгое соблюдение
обратной совместимости привело к тому, что
в Java не так просто вносить какие-то
новшества. На практике, даже самая
замечательная идея либо не полностью
реализуется, либо реализуется через какие-то
костыли. Например:
50. Критика Java - обобщения
Обобщения (генерики) были реализованы, начиная с
Java 5 для улучшения безопасности типов и легальной поддержки
методов и классов, способных обрабатывать различные типы
данных.
public class Box {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
Обобщённая версия:
public class Box<T> {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
51. Критика Java - обобщения
Чтобы не ломать совместимость, обобщения реализовали
через стирание типов. Компилятор видит обобщённые типы
и может их проверить. Но при выполнении программы типы
обобщённых классов и методов недоступны. Это
накладывает ограничения, например, все три выражения
приведут к ошибкам компиляции:
public void set(T t) {
if (item instanceof E) {
...
}
E item2 = new E();
E[] iArray = new E[10];
}
Имеются и более тяжеловесные примеры. На практике это
ограничение не вызывает серьёзных неудобств, но те, кто
пришли в Java после C# разницу могут заметить.
52. Критика Java - ООП
Объектная ориентированность это здорово, но
есть и другие парадигмы программирования,
например, функциональное программирование.
Функциональщики критикуют Java за то, что в
объекте нельзя подменять методы, или передавать
методы в качестве параметров. В Java 8 наконец-то
были введены Лямбда-функции (неофициально их
называют замыканиями), то есть, появилась
возможность отвязать данные от обслуживающих их
методов. Но опять же, реализация оставляет желать
лучшего — код для работы с лямбдами может быть
очень громоздким.
53. Критика Java - JVM
Выполнение программы в виртуальной машине
критикуют за то, что программа не может напрямую
работать с железом компьютера — она отделена
защитной оболочкой.
●
Не получится выжать из железа все соки
●
Трудно замерить реальную производительность
конкретного метода
В зависимости от JVM и её текущего состояния
время выполнения метода может заметно скакать.
Кто занимался оптимизацией производительности,
тот знает, о чём я говорю.
54. Критика Java - JVM
Отчасти это не так. Компилятор старается выжимать
из железа всё возможное, а если уж очень надо
нативную поддержку, то это можно реализовать, но
придётся писать нативный код для каждой целевой
платформы, что накладно. Но для Java уже есть
библиотеки, позволяющие задействовать
вычисления на видеокарте и писать
производительные игры.
55. Критика Java – отсутствие
беззнаковых типов
Низкоуровневая работа с числами, особенно типа byte, это
головная боль. Во всех нормальных языках тип byte может иметь
диапазон значений от 0 до 255, но только не в Java. Если пишется
HEX-редактор, или ведётся перекодирование или сжатие данных, или
просто, код портируется с других языков, например, с Си - разработчик
будет метаться — либо приводить всё к типу int, что автоматически
съест в 4 раза больше памяти, либо плясать с бубном вокруг битовой
арифметики, оперируя байтом, у которого диапазон значений от -128 до
127. Только в Java 8 разработчики спохватились и реализовали методы,
позволяющие хоть как-то избавить нас от этих мучений. Примеры:
Byte.toUnsignedInt()
Integer.compareUnsigned()
Integer.parseUnsignedInt()
Решение половинчатое, это очередной костыль. На уровне языка Java
по-прежнему не умеет работать с числами без знака.
56. Критика Java – числа с
плавающей точкой
Даже с модификатором strictfp стандарт
IEEE 754 - формат представления чисел с
плавающей точкой поддерживается не
полностью.
Обычных разработчиков это мало волнует, но
при точных научных расчётах могут случаться
непредвиденные вещи. Но, если уж говорить
совсем честно, то результаты вычислений в
языке C# ещё более непредсказуемые.
57. Критика Java – запрет на
перегрузку операторов
У обычного разработчика желание назначить
какому-нибудь оператору, например,
оператору сложения другой функционал не
возникнет.
Запрет на перегрузку операторов идёт только
на пользу. Кто писал код в Си, тот помнит, к
чему приводят подобные манипуляции.
Такой код трудно поддерживать и он чреват
ошибками.
58. Критика Java – нет
составных типов
В C++ и C# имеются структуры — если говорить
по-простому, то это тип данных, к которому можно получать
доступ напрямую, а не через ссылку. Примитивные типы
хранятся не в куче, вместе с объектами, а в стеке вызовов
или в статических классах, что делает работу с ними более
продуктивной. На практике имеем повышенное потребление
памяти — вместо зарезервированного блока байт,
отведённого под конкретные данные надо помнить ещё и
информацию об объекте.
Тип HashMap, реализован как массив объектов
HashMap.Entry. В Java это массив ссылок на объекты Entry,
которые, в свою очередь, ссылаются на объекты ключа и
значения. Как результат - лишнее перенаправление, лишнее
потребление памяти и вероятность фрагментации кучи.
59. Критика Java – массивы
Ограничение на размер массива. Массивы в
Java индексируются типом int со знаком.
●
Блок байт до 2 Гб
●
До 2 миллиардов элементов в коллекции
Так можно придираться к любому языку. Нужно
больше 2 Гб — организуются страницы данных.
Про 2 миллиарда нужно помнить для
собеседования.
60. Критика Java – массивы
Нет настоящих многомерных массивов. В Java это
ссылки ссылок, что, при трудоёмких расчётах
сказывается на производительности. В С# можно
использовать оба типа массивов.
Ограничение на инициализацию массивов. По-сути,
данные массива заменяются байт-кодом, который при
выполнении программы заносит в массив значения,
одно за другим. Если захардкодить данных более чем
на 64 Кб — получим ошибку компиляции "Error: code too
large". Методы в Java не могут быть больше 64 Кб.
На практике такие объёмы данных загружаются из
файла.
61. Критика Java
примитивные типы
Примитивные типы в Java реализованы не так,
как ссылочные. Это сделано в угоду
производительности. Но если пишется
библиотечный код, часто бывает нужно для
каждого типа написать свой обработчик. Отчасти
это лечится классами-обёртками, но и они не
более чем костыль.
62. Критика Java
многопоточный код
В Java легко можно писать многопоточный код,
это одно из его главных преимуществ, но на
уровне языка и компилятора не удаётся достичь
100% безопасности и надёжности.
Между собой программисты могут договориться
о доступе к глобальным переменным, но на
уровне языка этот доступ регламентировать
нельзя.
63. Критика Java
производительность
Код Java никогда не будет быстрее аналогичного
скомпилированного кода, написанного, скажем,
на языке Си. Есть прослойка в виде JVM, а
интерпретаторы по определению работают
медленнее компиляторов.
Первые версии Java сильно страдали от этого,
но, начиная с версии 1.3 была реализована Just
in Time компиляция, и теперь, скорость
выполнения Java кода сравнима со скоростью
работы платформо-ориентированного кода.
64. Критика Java
производительность
Даже если для Java напишут идеальный
компилятор — не получится написать семейство
виртуальных машин, заточенных под какие-то
конкретные аппаратные особенности, это
слишком затратно.
То есть, всегда можно написать нативный код,
который будет на всю катушку использовать
возможности железа, в то время, как JVM будет
довольствоваться только самыми
распространёнными возможностями.
65. Критика Java
безопасность
Безопасность - один из ключевых приоритетов для
разработчиков Java и JVM. Некорректный или вредоносный
код не должен нанести вреда, поэтому, недостоверный код,
например, апплеты, выполняются в специальной песочнице
и не имеют доступа ко многим ресурсам системы.
Начиная с 2010, участились случаи использования дыр в
безопасности. Заплатки выпускаются с большой задержкой,
да к тому же, пользователи не спешат обновлять Java, не
следят за изменениями, или не могут обновить Java на
своих машинах, поскольку это ручная операция. Даже Flash
периодически обновляется. Как результат — апплеты по
умолчанию перестали запускаться, и в скором времени их
вообще прибили.
66. Критика Java
безопасность
У Java не было ограничений на количество
установленных версий. Например, рядом с
заплатанной и безопасной Java 7 могла стоять
уязвимая Java 6, что развязывало руки
злоумышленникам.
Кроме всего прочего, Java не обновляется
автоматически, и для своего обновления требует
права администратора — это тоже мешает
поддерживать актуальность виртуальной
машины.
67. Критика Java
Много критики, хотя, надо признать, что почти
все случаи являются частными, либо уже
исправлены, и на практике почти не встречаются.
Вот, с чем реально можно столкнуться:
68. Критика Java
Jar Hell
Загрузчика классов не позволяет загрузить в одну JVM
несколько разных версий классов с совпадающим полным
именем (название класса + пакет).
Обычно к проекту подключается несколько необходимых
библиотек, они, в свою очередь, могут опираться на ещё
несколько библиотек. Всё хорошо, пока все эти библиотеки
разные, или, если и совпадающие, то имеют одинаковую
версию. В другом случае, имеется небольшая вероятность
пляски с бубном или необходимости более тщательного
подбора используемых библиотек. Есть надежда, что с
реализацией в Java 9 проекта Jigsaw, возможности
создавать модули, о Джар хеллах можно будет забыть раз и
навсегда.
69. Критика Java
кроссплатформенность
Кроссплатформенность Java является одной из причин
популярности этого языка. Но на практике,
кроссплатформенность далеко не 100%. Допустим,
различия во внешнем виде десктопных приложений
можно объяснить тем, что в разных системах
используются разные шрифты, у них разные заголовки
окон, и так далее. Разницу в работе с файловыми
системами тоже постарались максимально
нивелировать на уровне встроенных библиотек, но не
полностью.
●
Swing — PRESSED/RELEASED
70. Критика Java
проверяемые исключения
Очередная «сильная» сторона Java, призванная
устранять многие ошибки ещё на уровне компиляции.
На самом же деле, это не самый удачный эксперимент,
который, после опыта Java больше никто не рискнул
повторить в своём языке.
На практике случается так, что перехватывать
исключение не нужно, или, его перехват всё равно
ничем не поможет. Или надо просто заглушить
исключение, сделать его не проверяемым. Во всех
случаях приходится писать try-catch, а в последнем ещё
и бросать RuntimeException. Кто работал с файлами,
или базами данных, тот прекрасно помнит похожую
конструкцию:
71. InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(inputFileName);
out = new FileOutputStream(outputFileName);
copy(in, out);
} catch (IOException e) {
e.printStackTrace();
} finally {
close(in);
close(out);
}
public static void close(Closeable c) {
if (c == null) return;
try {
c.close();
} catch (IOException e) {
//log the exception
}
}
72. Критика Java
проверяемые исключения
Это ещё не самый плохой пример. Одна операция
копирования данных из одного файлового потока в
другой обёрнута в простыню сопутствующего кода.
●
Плохая читабельность
●
Много бессмысленной работы
В современной Java с этим отчасти справляются за счёт
автоматического управления ресурсами, а в различных
библиотеках и фреймворках уже давно есть готовые
решения для всех возникающих задач.
В Streams API в Java 8 от проверяемых исключений
отказались и вовсе.
73. Экосистема Java
У Java громадное сообщество, которое, за более
чем 20 лет не только выявило все слабые места
в библиотеках Java, но и предложило достойные
решения. Другими словами, представленные
далее библиотеки реализуют то, чего в
библиотеках Java не достаёт или не доставало.
Рассмотрим данные
проекта Maven.
74. JUnit
На первом месте с большим отрывом находится
фреймворк JUnit. Авторы — легендарные Эрих Грамма
(банда четырёх) и Кент Бек. Сейчас без него не
обходится, пожалуй ни один проект. В языке Java нет
встроенных инструментов тестирования. Только в
версии 1.4 появилось ключевое слово assert,
позволяющее проверить определённые утверждения, но
это капля в море.
Другие инструменты для тестирования: Mockito на 11-м
месте, TestNG на 21-м. В сотню
вошли: EasyMock, Hamcrest,
FindBugs, AssertJ и PowerMock.
75. Библиотеки логирования
В десятку лучших попали самые популярные
библиотеки логирования: с двукратным отрывом
SLF4J, затем Log4j и Logback. В самой Java
имеется пакет java.util.logging, но возможности
у него очень базовые. Commons Logging входит
в двадцатку.
76. Google Guava и Apache Commons - замечательные
коллекции инструментов, превращающие создание кода на
Java в удовольствие. Во многом у них дублирующийся
функционал, но инструмент от Google новее, современнее и
популярнее, к тому же, предоставляет удобную миграцию из
кода конкурента. Перечислять всё, что могут эти библиотеки
долго. Они подменяют многие стандартные возможности
Java более гибкими и удобными решениями. Этим двум
титанам заметно уступают в популярности решения от
Plexus.
Если нет проблем с подключением сторонних библиотек, то
рекомендую опираться на эти коллекции инструментов.
77. До недавнего времени работа с датой и временем
в Java были реализованы и рук вон плохо,
поэтому, появилось несколько альтернативных
решений, самое популярное - Joda Time. В Oracle
спохватились и, начиная с Java 8 постарались
реализовать в Date Time API функционал Joda
Time, а заодно и улучшить его. По состоянию на
2016-й год, Java 8 используется уже более чем в
60% проектов, и, казалось бы, самое время
отказаться от Joda Time, но, цифры говорят
обратное — библиотека всё ещё популярна.
78. JSON
Два явных лидера. Взрослый и солидный Jackson, и,
уже успевший его обогнать, Google Gson. Оба
полноценные и качественные, но проект от Google
новее, и удобнее в использовании.
Решение от org.json в популярности уступает.
Начиная с Java EE 7 запоздало появился пакет
javax.json, но, я почти уверен, что эта библиотека
уступает другим.
79. Spring Framework - самый известный и спрашиваемый в CV
фреймворк для Java. Он вырос на костях громоздких
Enterprise решений от Sun, в частности, является отличной
альтернативой первым версиям Enterprise JavaBeans.
Естественно, в Sun/Oracle позднее спохватились и даже
переписали код, чтобы EJB стал дружественным для
программистов. Но паровоз уже ушёл, и приличную долю
корпоративного сегмента сейчас занимает именно Spring. В
первую очередь, он обеспечивает внедрение зависимостей,
а во вторую — является замечательным решением в таких
областях, как аспект-ориентированное программирование,
работа с данными, управление транзакциями, MVC,
удалённый доступ, аутентификация и авторизация,
безопасность, работа с сообщениями, и прочее-прочее.
80. Даже если брать Spring в качестве
веб-фреймворка, то Spring MVC и
Spring Boot рвут всех своих ближайших
конкурентов:
82. Google Guice
Google Guice — легковесный фреймворк для
внедрения зависимостей с помощью аннотаций.
По отзывам, он проще в использовании, чем
Spring, и, вероятно быстрее работает.
Если заходит речь о производительности, то
стоит присмотреться к проекту Dagger, опять
таки, от Google. Он генерирует весь
необходимый код на этапе
компиляции.
83. OSGi
OSGi (Open Services Gateway Initiative) -
спецификация динамической модульной
системы и сервисной платформы для Java-
приложений. Модель для построения
приложения из компонентов, связанных вместе
посредством сервисов. Суть заключается в
возможности переинсталлировать динамически
компоненты и составные части приложения без
необходимости его остановки и перезапуска.
84. Работа с базами данных
В Java не встроены движки баз данных, но зато
написан стандарт JDBC, по которому любой
разработчик движка базы данных SQL может
написать драйвер для доступа к его продукту.
Естественно, эти драйвера давно написаны, и
успешно используются, но для работы с базами
данных приходится писать много
повторяющегося кода. Самое известное решение
этой проблемы — Hibernate.
85. Работа с базами данных
Hibernate решает задачу объектно-реляционного
отображения. Он обеспечивает
прозрачную поддержку сохранности
данных для «POJO» (стандартных
Java-объектов).
Базы данных NoSQL не вписываются в
этот стандарт, и для доступа к ним
написаны индивидуальные интерфейсы.
У Java, благодаря сторонней поддержке, нет недостатка
в базах данных — какие хочешь и на любой вкус.
87. Итого
Будущее у Java на ближайшее время обещает
быть стабильным. На словах язык хоронят давно,
но безуспешно.
●
Корпоративный сектор очень инертен
●
Java ME Embedded ещё покажет себя
●
Google для разработки под Android не отказался
от Java в пользу Go или Dart, просто в качестве
комплекта для разработки будет использоваться
OpenJDK.
88. С какого языка начинать
программировать?
Часто спрашивают - какой язык учить первым, что
выбрать на перспективу? Ответ очевиден - Java
Си-подобый синтаксис. Если надо - можно быстро
переключиться на Си, JS или C#.
Чёткий и понятный синтаксис, строгая типизация и
сборщик мусора позволяют сосредоточиться на
разработке, не отвлекаясь на что-то ещё.
Богатейшая экосистема позволяет выбрать готовые
строительные кирпичики, чтобы повторно не
изобретать велосипед.