SlideShare uma empresa Scribd logo
1 de 89
Baixar para ler offline
Java
вчера, сегодня, завтравчера, сегодня, завтра
- большая обзорная лекция -- большая обзорная лекция -
Ставила Леонид
27 марта 2017
mondaymonday
Краткое содержание

История появления и развития Java

Идеи, лежащие в основе языка

Сферы применения

Сильные и слабые стороны

Место среди других языков

Экосистема Java
Язык Java

Промышленный, строго типизированный,
объектно-ориентированный

Sun Microsystems, 1991

Джеймс Гослинг

Greentalk → Oak → Java

Для бытовой электроники со слабой
аппаратной начинкой.
Требования к новому языку

Независимость от платформы

Высокая надёжность

Компактность
Некоторые факты

Официальный анонс: 1995-й год

Первая версия: 1996-й год

Синтаксис взят из C++, но проще
Долгая разработка, почему?
Разное железо, отделили язык
Нелёгкий старт

Одна целевая платформа == +1 JVM

Не продолжение C++

Сборщик мусора, компактность,
распределённость, многопоточность

Отсутствие интереса к платформе
Pascal, UNIX
Язык для Web

Собственный браузер HotJava

Поддержка Java в Netscape

Популярность росла вместе с интернетом
Девиз
«Написан однажды — работает везде»
«Write Once, Run Anywhere»
Код Java (.java)Код Java (.java)
Компилятор
JAVAC
Компилятор
JAVAC
Байт-код (.class)Байт-код (.class)
JVMJVM JVMJVM
WindowsWindows LinuxLinux MacMac
JVMJVM
Виртуальная машина
Плюсы:

Байт-код независим от операционной
системы и железа. Один и тот же код
одинаково работает в Windows и Linux.

Контроль выполнения программы, запрет
потенциально опасных операций.
Минусы:

Страдает производительность. Решается
компиляцией байт-кода в машинный код,
так называемая JIT-компиляция.
Виртуальная машина

Настоящее произведение искусства

Очень производительная

Ах, как хороша
Для JVM адаптировано более 20 языков: Groovy,
Clojure, Scala, Kotlin, JRuby, Jython, ...
убийцы
Виртуальная машина

Классические JVM: Windows, Linux, Mac OS,
начиная с 7-й версии и Solaris

В мобилках из 2000-х, включая Symbian свои

В Blue-ray устройствах и всяких железяках свои

В устройствах, под управлением Android
собственная виртуальная машина - Dalvik и его
преемница - Android Runtime

Разнообразные сторонние разработки

Название языка происходит от марки
кофе.

Другая версия утверждает, что это
отсылка к кофе-машине, одному из
приборов, для которого это язык и
разрабатывался.
Язык мог и до нашего
времени называться
«Дубом», но эта торговая
марка уже была
зарегистрирована.
Основные
характеристики Java

Простота

Объектная-ориентированность

Распределённость

Устойчивость

Безопасность

Независимость от системы

Мобильность

Интерпретируемость

Высокая эффективность

Многопоточность

Динамичность
Простота

Синтаксически Java очень напоминает Си

Не надо привыкать к очередному
чудаковатому синтаксису

Нет указателей, перегрузки операторов,
оператора goto, конструкций struct и union.

Упрощён насколько было возможно, но не в
ущерб функциональности

Более чем вдвое сокращает разработку, в
сравнении с C++
Объектная
ориентированность

Всё может быть объектом. Объект это данные
и методы, изменяющие эти данные в одной
упаковке.

ООП - не панацея. Временами не хватает
процедурного или функционального
программирования. Например, для запуска
Java программы метод main() приходится
вписывать в класс. Это громоздко.

Функциональные возможности в виде лямбда-
выражений были добавлены в Java 8.
Существительное, глагол
Распределённость
На Java можно писать приложения для:

различных платформ

операционных систем

графических интерфейсов пользователя
Java так же предназначен для поддержки
сетевых приложений. Таким образом он
широко используется как инструмент
разработки в среде подобной Internet, где
существуют различные платформы.
Файл на
удалённом
ПК
Устойчивость
Код Java должен одинаково хорошо работать
на различных экзотических платформах.
Следовательно, он должен быть очень
устойчив.
Решения:

Строгая типизация

Отсутствие указателей

Отсутствие прямой работы с памятью

Сборщик мусора

Механизм обработки исключений
Компиляция, = ==, & &&, выполнение
Безопасность
В Java и JVM несколько уровней защиты.
На уровне языка:

Объекты. Разрешается использоваться только
объявленные методы с соответствующим
уровнем видимости. Инкапсуляция

Отсутствие прямого доступа к памяти

Проверка массивов на переполнение
На уровне компилятора и интерпретатора:

Песочница для подозрительных приложений

Ограничение доступа к некоторым ресурсам
Вирусы в 90-е
инициализация
Независимость от системы
Код Java (.java)Код Java (.java)
Компилятор
JAVAC
Компилятор
JAVAC
Байт-код (.class)Байт-код (.class)
JVMJVM JVMJVM
WindowsWindows LinuxLinux MacMac
JVMJVM
Код Java выполняется на различных
платформах: Windows, Linux, Mac OS и других.
Это достигается с помощью компиляции
и последующей
интерпретации кода.
1 платформа == 1 JVM
Компиляторы
Компиляторы Java очень продвинутые.

Они тщательно оптимизируют код

И даже выбрасывают ненужное
Байт-код будет выполнять в точности то,
что было запрограммировано, но, при
декомпиляции, исходный код не всегда
совпадает с тем, что написал программист.
тестирование
Мобильность

Независимость от платформы

Лёгкость переноса исходного кода программы,
или скомпилированного кода
* при условии, что для целевой
платформы имеется JVM.
Типы, правила повышения
Интерпретируемость
Java - интерпретируемый язык.
Каждая команда интерпретируется в
машинный код во время выполнения
программы, а не во время компиляции.
На какой бы версии Java не был написан код,
после компиляции он превращается в
совершенно нейтральный байт-код, который
может интерпретировать любая другая
подходящая JVM.
Высокая эффективность
Язык Java разрабатывался с прицелом на
центральные процессоры с очень низким
энергопотреблением.
Байт-код Java тщательно продуман так, чтобы
его можно было очень эффективно
транслировать в машинный код.
Современные компиляторы, JIT
Многопоточность
●
Встроенная поддержка многопоточности
позволяет выжимать больше
производительности из процессоров и
организовывать работу интерактивных
приложений.
●
В стандартных библиотеках имеются
средства контроля доступа к совместно
используемым данным.
Динамичность
Java - динамический язык программирования.
Программы Java во время выполнения могут
возвращать много полезной информации, что
позволяет динамически безопасно связать код,
или получать какие-то данные об объектах и их
методах при помощи рефлексии.
История развития Java
Первая версия: 23 января 1996-го года, Oak
Стабильная версия JDK 1.0.2 == Java 1
Что из спецификации Oak не попало в Java?

Беззнаковые примитивные типы

Перечисления (+ в Java 5)

Ключевое слово assert (+ в Java 1.4)
Различия:

Абстрактные методы в стиле C++

Другие области видимости. Нет эквивалента private

Все исключения не проверяемые

Дополнительные условия для переменных класса

Определение условий для методов notnull
JDK 1.1
19.02.1997

Переписана модель событий AWT

Внутренние классы

JavaBeans

JDBC

Вызов удалённых методов

Рефлексия (только анализ кода)

Компилятор JIT (Just In Time) для Windows
стандарт взаимодействия с различными СУБД SQL
J2SE 1.2 (Playground)
08.12.1998
Java разделили на 3 линейки. Говорим о:
Java 2 Platform, Standard Edition

На смену AWT пришёл Swing

Инфраструктура коллекций

Цифровые сертификаты

Java 2D

Drag-and-Drop

Полная поддержка Unicode

strictfp
J2SE 1.3 (Kestrel)
08.05.2000

Виртуальная машина HotSpot

JavaSound

Синтетические классы

Java Naming and Directory Interface (JNDI)

StrictMath

Timer API
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
J2SE 5.0 (Tiger)
30.09.2004
Обобщения

Аннотации

Автоупаковка примитивных типов

Перечислимые типы (enum)

Методы с неопределённым числом параметров

Импорт статических методов и переменных

Цикл foreach

Комментарии javadoc

ProcessBuilder

Инструменты для изменения байт-кода методов во
время выполнения программы

Formatter, Scanner

Коллекции: новые интерфейсы Queue, BlockingQueue,
ConcurrentMap с несколькими реализациями, а так же
CopyOnWriteArrayList, CopyOnWriteArraySet, EnumSet,
EnumMap, несколько новых методов класса Collections
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
Java SE 7 (Dolphin)
28.07.2011

Поддержка динамических языков на уровне JVM

Строковые параметры в switch

Автоматическое управление ресурсами (try-с-ресурсами)

Двоичные литералы

Знаки подчёркивания в числовых литералах

Параллельные утилиты, Fork/Join Framework

NIO 2.0

JavaFX

Конвейер XRender для Java 2D

Поддержка алгоритмов эллиптической криптографии

JVM для Solaris

Коллекции: новый интерфейс TransferQueue, улучшена
функция подсчёта хеш-кодов для некоторых коллекций
Java SE 8
18.03.2014

Лямбда-выражения

Методы по умолчанию в интерфейсах

Аннотации типов

Параллельная сортировка массивов

JavaScript в приложениях

Беззнаковая целочисленная арифметика

Date and Time API

Кодер/декодер Base64

Запуск JavaFX программ

JVM: упразднён Permanent Generation

Стримы и параллельные стримы для
обработки коллекций, совокупные операции.
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
Java SE 10
Ходят слухи об объектах без
идентификаторов, а так же массивах с 64-
битной адресацией.
●
JSR 354: Money and Currency API
(изначально планировали в Java 9)
Java: вчера, сегодня, завтра
Семейство Java
Начиная с J2SE разрабатывается несколько
линеек Java под разные сферы деятельности.

Java SE — основное издание Java: компиляторы, API,
JRE; подходит для создания пользовательских
приложений.

Java EE — спецификации для создания ПО уровня
предприятия.

Java ME — для мобильных телефонов, КПК,
встроенных систем, другой маломощной электроники

Java Card — для приложений, работающих на смарт-
картах и других устройствах с ограниченным объёмом
памяти и возможностями обработки.
Место Java
среди других языков
Рейтинг PYPL показывает частоту поиска в Google
документации по языкам. Тут Java явный лидер на
протяжении многих лет, и угроза видится только со стороны
Python.
GitHub
Топ-лист от GitHub ведёт статистику, начиная с
2008-го года. За первое место борются JavaScript и Java.
Code Eval
Code Eval собирает свою статистику, и согласно
их рейтинга за 2016-й год, лидеры Python и Java.
TIOBE
Рейтинг, составленный по данным поисковиков. Индекс
TIOBE основан на результатах подсчета поисковых
запросов, содержащих название языка (+"<language>
programming"). Он интересен главным образом потому,
что ведётся с 2001-го года. Java и C тут вне конкуренции,
хотя, для нашего времени на графике видно резкое
падение индекса обоих языков.
Indeed.com
Если посмотреть на рынок труда, то мы увидим, что
спрос на программистов Си и Java очень высок:
Indeed.com
Больше всего ищут работу Джависты:
Другая статистика

Самые продаваемые книги: Java, JavaScript, C#

По результатам опроса программистов, текущие и
предпочитаемые языки: Java, C#, JavaScript

Можно рассмотреть с десяток рейтингов в табличном виде,
но это будет скучно.
Java за первые несколько лет своего развития стремительно
ворвался в тройку лидеров и до сих пор достаточно
уверенно держит свои позиции, возможно, даже и первое
место. И это при том, что Desktop направление не получило
должного развития, хотя, имеются и шедевры: Eclipse, IntelliJ
Idea, NetBeans, и, хит всех времён и
народов - Minecraft. Технология
апплетов вообще мертва, а новые и
востребованные возможности если
и появляются, то с задержками.
Где используется Java?
Основная популярность: полноценные
веб-приложения, корпоративный back-end, и, как это ни
удивительно, Desktop-приложения. К сожалению,
статистика не очень подробная, на ней не нашлось
места Big Data, и, конечно же, Android'у. Можно только
гадать. Так же нет информации, насколько широко Java
используется в бытовых приборах,
всевозможных датчиках и
встраиваемых системах, но,
судя по статьям в интернете,
и заявлениям Oracle –
используется,
причём крайне
успешно.
Цифры от 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
Критика Java
Следование принципу «написано однажды —
работает везде», а так же строгое соблюдение
обратной совместимости привело к тому, что
в Java не так просто вносить какие-то
новшества. На практике, даже самая
замечательная идея либо не полностью
реализуется, либо реализуется через какие-то
костыли. Например:
Критика 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; }
}
Критика Java - обобщения
Чтобы не ломать совместимость, обобщения реализовали
через стирание типов. Компилятор видит обобщённые типы
и может их проверить. Но при выполнении программы типы
обобщённых классов и методов недоступны. Это
накладывает ограничения, например, все три выражения
приведут к ошибкам компиляции:
public void set(T t) {
if (item instanceof E) {
...
}
E item2 = new E();
E[] iArray = new E[10];
}
Имеются и более тяжеловесные примеры. На практике это
ограничение не вызывает серьёзных неудобств, но те, кто
пришли в Java после C# разницу могут заметить.
Критика Java - ООП
Объектная ориентированность это здорово, но
есть и другие парадигмы программирования,
например, функциональное программирование.
Функциональщики критикуют Java за то, что в
объекте нельзя подменять методы, или передавать
методы в качестве параметров. В Java 8 наконец-то
были введены Лямбда-функции (неофициально их
называют замыканиями), то есть, появилась
возможность отвязать данные от обслуживающих их
методов. Но опять же, реализация оставляет желать
лучшего — код для работы с лямбдами может быть
очень громоздким.
Критика Java - JVM
Выполнение программы в виртуальной машине
критикуют за то, что программа не может напрямую
работать с железом компьютера — она отделена
защитной оболочкой.
●
Не получится выжать из железа все соки
●
Трудно замерить реальную производительность
конкретного метода
В зависимости от JVM и её текущего состояния
время выполнения метода может заметно скакать.
Кто занимался оптимизацией производительности,
тот знает, о чём я говорю.
Критика Java - JVM
Отчасти это не так. Компилятор старается выжимать
из железа всё возможное, а если уж очень надо
нативную поддержку, то это можно реализовать, но
придётся писать нативный код для каждой целевой
платформы, что накладно. Но для Java уже есть
библиотеки, позволяющие задействовать
вычисления на видеокарте и писать
производительные игры.
Критика Java – отсутствие
беззнаковых типов
Низкоуровневая работа с числами, особенно типа byte, это
головная боль. Во всех нормальных языках тип byte может иметь
диапазон значений от 0 до 255, но только не в Java. Если пишется
HEX-редактор, или ведётся перекодирование или сжатие данных, или
просто, код портируется с других языков, например, с Си - разработчик
будет метаться — либо приводить всё к типу int, что автоматически
съест в 4 раза больше памяти, либо плясать с бубном вокруг битовой
арифметики, оперируя байтом, у которого диапазон значений от -128 до
127. Только в Java 8 разработчики спохватились и реализовали методы,
позволяющие хоть как-то избавить нас от этих мучений. Примеры:
Byte.toUnsignedInt()
Integer.compareUnsigned()
Integer.parseUnsignedInt()
Решение половинчатое, это очередной костыль. На уровне языка Java
по-прежнему не умеет работать с числами без знака.
Критика Java – числа с
плавающей точкой
Даже с модификатором strictfp стандарт
IEEE 754 - формат представления чисел с
плавающей точкой поддерживается не
полностью.
Обычных разработчиков это мало волнует, но
при точных научных расчётах могут случаться
непредвиденные вещи. Но, если уж говорить
совсем честно, то результаты вычислений в
языке C# ещё более непредсказуемые.
Критика Java – запрет на
перегрузку операторов
У обычного разработчика желание назначить
какому-нибудь оператору, например,
оператору сложения другой функционал не
возникнет.
Запрет на перегрузку операторов идёт только
на пользу. Кто писал код в Си, тот помнит, к
чему приводят подобные манипуляции.
Такой код трудно поддерживать и он чреват
ошибками.
Критика Java – нет
составных типов
В C++ и C# имеются структуры — если говорить
по-простому, то это тип данных, к которому можно получать
доступ напрямую, а не через ссылку. Примитивные типы
хранятся не в куче, вместе с объектами, а в стеке вызовов
или в статических классах, что делает работу с ними более
продуктивной. На практике имеем повышенное потребление
памяти — вместо зарезервированного блока байт,
отведённого под конкретные данные надо помнить ещё и
информацию об объекте.
Тип HashMap, реализован как массив объектов
HashMap.Entry. В Java это массив ссылок на объекты Entry,
которые, в свою очередь, ссылаются на объекты ключа и
значения. Как результат - лишнее перенаправление, лишнее
потребление памяти и вероятность фрагментации кучи.
Критика Java – массивы
Ограничение на размер массива. Массивы в
Java индексируются типом int со знаком.
●
Блок байт до 2 Гб
●
До 2 миллиардов элементов в коллекции
Так можно придираться к любому языку. Нужно
больше 2 Гб — организуются страницы данных.
Про 2 миллиарда нужно помнить для
собеседования.
Критика Java – массивы
Нет настоящих многомерных массивов. В Java это
ссылки ссылок, что, при трудоёмких расчётах
сказывается на производительности. В С# можно
использовать оба типа массивов.
Ограничение на инициализацию массивов. По-сути,
данные массива заменяются байт-кодом, который при
выполнении программы заносит в массив значения,
одно за другим. Если захардкодить данных более чем
на 64 Кб — получим ошибку компиляции "Error: code too
large". Методы в Java не могут быть больше 64 Кб.
На практике такие объёмы данных загружаются из
файла.
Критика Java
примитивные типы
Примитивные типы в Java реализованы не так,
как ссылочные. Это сделано в угоду
производительности. Но если пишется
библиотечный код, часто бывает нужно для
каждого типа написать свой обработчик. Отчасти
это лечится классами-обёртками, но и они не
более чем костыль.
Критика Java
многопоточный код
В Java легко можно писать многопоточный код,
это одно из его главных преимуществ, но на
уровне языка и компилятора не удаётся достичь
100% безопасности и надёжности.
Между собой программисты могут договориться
о доступе к глобальным переменным, но на
уровне языка этот доступ регламентировать
нельзя.
Критика Java
производительность
Код Java никогда не будет быстрее аналогичного
скомпилированного кода, написанного, скажем,
на языке Си. Есть прослойка в виде JVM, а
интерпретаторы по определению работают
медленнее компиляторов.
Первые версии Java сильно страдали от этого,
но, начиная с версии 1.3 была реализована Just
in Time компиляция, и теперь, скорость
выполнения Java кода сравнима со скоростью
работы платформо-ориентированного кода.
Критика Java
производительность
Даже если для Java напишут идеальный
компилятор — не получится написать семейство
виртуальных машин, заточенных под какие-то
конкретные аппаратные особенности, это
слишком затратно.
То есть, всегда можно написать нативный код,
который будет на всю катушку использовать
возможности железа, в то время, как JVM будет
довольствоваться только самыми
распространёнными возможностями.
Критика Java
безопасность
Безопасность - один из ключевых приоритетов для
разработчиков Java и JVM. Некорректный или вредоносный
код не должен нанести вреда, поэтому, недостоверный код,
например, апплеты, выполняются в специальной песочнице
и не имеют доступа ко многим ресурсам системы.
Начиная с 2010, участились случаи использования дыр в
безопасности. Заплатки выпускаются с большой задержкой,
да к тому же, пользователи не спешат обновлять Java, не
следят за изменениями, или не могут обновить Java на
своих машинах, поскольку это ручная операция. Даже Flash
периодически обновляется. Как результат — апплеты по
умолчанию перестали запускаться, и в скором времени их
вообще прибили.
Критика Java
безопасность
У Java не было ограничений на количество
установленных версий. Например, рядом с
заплатанной и безопасной Java 7 могла стоять
уязвимая Java 6, что развязывало руки
злоумышленникам.
Кроме всего прочего, Java не обновляется
автоматически, и для своего обновления требует
права администратора — это тоже мешает
поддерживать актуальность виртуальной
машины.
Критика Java
Много критики, хотя, надо признать, что почти
все случаи являются частными, либо уже
исправлены, и на практике почти не встречаются.
Вот, с чем реально можно столкнуться:
Критика Java
Jar Hell
Загрузчика классов не позволяет загрузить в одну JVM
несколько разных версий классов с совпадающим полным
именем (название класса + пакет).
Обычно к проекту подключается несколько необходимых
библиотек, они, в свою очередь, могут опираться на ещё
несколько библиотек. Всё хорошо, пока все эти библиотеки
разные, или, если и совпадающие, то имеют одинаковую
версию. В другом случае, имеется небольшая вероятность
пляски с бубном или необходимости более тщательного
подбора используемых библиотек. Есть надежда, что с
реализацией в Java 9 проекта Jigsaw, возможности
создавать модули, о Джар хеллах можно будет забыть раз и
навсегда.
Критика Java
кроссплатформенность
Кроссплатформенность Java является одной из причин
популярности этого языка. Но на практике,
кроссплатформенность далеко не 100%. Допустим,
различия во внешнем виде десктопных приложений
можно объяснить тем, что в разных системах
используются разные шрифты, у них разные заголовки
окон, и так далее. Разницу в работе с файловыми
системами тоже постарались максимально
нивелировать на уровне встроенных библиотек, но не
полностью.
●
Swing — PRESSED/RELEASED
Критика Java
проверяемые исключения
Очередная «сильная» сторона Java, призванная
устранять многие ошибки ещё на уровне компиляции.
На самом же деле, это не самый удачный эксперимент,
который, после опыта Java больше никто не рискнул
повторить в своём языке.
На практике случается так, что перехватывать
исключение не нужно, или, его перехват всё равно
ничем не поможет. Или надо просто заглушить
исключение, сделать его не проверяемым. Во всех
случаях приходится писать try-catch, а в последнем ещё
и бросать RuntimeException. Кто работал с файлами,
или базами данных, тот прекрасно помнит похожую
конструкцию:
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
}
}
Критика Java
проверяемые исключения
Это ещё не самый плохой пример. Одна операция
копирования данных из одного файлового потока в
другой обёрнута в простыню сопутствующего кода.
●
Плохая читабельность
●
Много бессмысленной работы
В современной Java с этим отчасти справляются за счёт
автоматического управления ресурсами, а в различных
библиотеках и фреймворках уже давно есть готовые
решения для всех возникающих задач.
В Streams API в Java 8 от проверяемых исключений
отказались и вовсе.
Экосистема Java
У Java громадное сообщество, которое, за более
чем 20 лет не только выявило все слабые места
в библиотеках Java, но и предложило достойные
решения. Другими словами, представленные
далее библиотеки реализуют то, чего в
библиотеках Java не достаёт или не доставало.
Рассмотрим данные
проекта Maven.
JUnit
На первом месте с большим отрывом находится
фреймворк JUnit. Авторы — легендарные Эрих Грамма
(банда четырёх) и Кент Бек. Сейчас без него не
обходится, пожалуй ни один проект. В языке Java нет
встроенных инструментов тестирования. Только в
версии 1.4 появилось ключевое слово assert,
позволяющее проверить определённые утверждения, но
это капля в море.
Другие инструменты для тестирования: Mockito на 11-м
месте, TestNG на 21-м. В сотню
вошли: EasyMock, Hamcrest,
FindBugs, AssertJ и PowerMock.
Библиотеки логирования
В десятку лучших попали самые популярные
библиотеки логирования: с двукратным отрывом
SLF4J, затем Log4j и Logback. В самой Java
имеется пакет java.util.logging, но возможности
у него очень базовые. Commons Logging входит
в двадцатку.
Google Guava и Apache Commons - замечательные
коллекции инструментов, превращающие создание кода на
Java в удовольствие. Во многом у них дублирующийся
функционал, но инструмент от Google новее, современнее и
популярнее, к тому же, предоставляет удобную миграцию из
кода конкурента. Перечислять всё, что могут эти библиотеки
долго. Они подменяют многие стандартные возможности
Java более гибкими и удобными решениями. Этим двум
титанам заметно уступают в популярности решения от
Plexus.
Если нет проблем с подключением сторонних библиотек, то
рекомендую опираться на эти коллекции инструментов.
До недавнего времени работа с датой и временем
в Java были реализованы и рук вон плохо,
поэтому, появилось несколько альтернативных
решений, самое популярное - Joda Time. В Oracle
спохватились и, начиная с Java 8 постарались
реализовать в Date Time API функционал Joda
Time, а заодно и улучшить его. По состоянию на
2016-й год, Java 8 используется уже более чем в
60% проектов, и, казалось бы, самое время
отказаться от Joda Time, но, цифры говорят
обратное — библиотека всё ещё популярна.
JSON
Два явных лидера. Взрослый и солидный Jackson, и,
уже успевший его обогнать, Google Gson. Оба
полноценные и качественные, но проект от Google
новее, и удобнее в использовании.
Решение от org.json в популярности уступает.
Начиная с Java EE 7 запоздало появился пакет
javax.json, но, я почти уверен, что эта библиотека
уступает другим.
Spring Framework - самый известный и спрашиваемый в CV
фреймворк для Java. Он вырос на костях громоздких
Enterprise решений от Sun, в частности, является отличной
альтернативой первым версиям Enterprise JavaBeans.
Естественно, в Sun/Oracle позднее спохватились и даже
переписали код, чтобы EJB стал дружественным для
программистов. Но паровоз уже ушёл, и приличную долю
корпоративного сегмента сейчас занимает именно Spring. В
первую очередь, он обеспечивает внедрение зависимостей,
а во вторую — является замечательным решением в таких
областях, как аспект-ориентированное программирование,
работа с данными, управление транзакциями, MVC,
удалённый доступ, аутентификация и авторизация,
безопасность, работа с сообщениями, и прочее-прочее.
Даже если брать Spring в качестве
веб-фреймворка, то Spring MVC и
Spring Boot рвут всех своих ближайших
конкурентов:
Тенденции последних лет говорят о том, что
популярность Spring только растёт:
Google Guice
Google Guice — легковесный фреймворк для
внедрения зависимостей с помощью аннотаций.
По отзывам, он проще в использовании, чем
Spring, и, вероятно быстрее работает.
Если заходит речь о производительности, то
стоит присмотреться к проекту Dagger, опять
таки, от Google. Он генерирует весь
необходимый код на этапе
компиляции.
OSGi
OSGi (Open Services Gateway Initiative) -
спецификация динамической модульной
системы и сервисной платформы для Java-
приложений. Модель для построения
приложения из компонентов, связанных вместе
посредством сервисов. Суть заключается в
возможности переинсталлировать динамически
компоненты и составные части приложения без
необходимости его остановки и перезапуска.
Работа с базами данных
В Java не встроены движки баз данных, но зато
написан стандарт JDBC, по которому любой
разработчик движка базы данных SQL может
написать драйвер для доступа к его продукту.
Естественно, эти драйвера давно написаны, и
успешно используются, но для работы с базами
данных приходится писать много
повторяющегося кода. Самое известное решение
этой проблемы — Hibernate.
Работа с базами данных
Hibernate решает задачу объектно-реляционного
отображения. Он обеспечивает
прозрачную поддержку сохранности
данных для «POJO» (стандартных
Java-объектов).
Базы данных NoSQL не вписываются в
этот стандарт, и для доступа к ним
написаны индивидуальные интерфейсы.
У Java, благодаря сторонней поддержке, нет недостатка
в базах данных — какие хочешь и на любой вкус.
Самые популярные
технологии
Итого
Будущее у Java на ближайшее время обещает
быть стабильным. На словах язык хоронят давно,
но безуспешно.
●
Корпоративный сектор очень инертен
●
Java ME Embedded ещё покажет себя
●
Google для разработки под Android не отказался
от Java в пользу Go или Dart, просто в качестве
комплекта для разработки будет использоваться
OpenJDK.
С какого языка начинать
программировать?
Часто спрашивают - какой язык учить первым, что
выбрать на перспективу? Ответ очевиден - Java

Си-подобый синтаксис. Если надо - можно быстро
переключиться на Си, JS или C#.

Чёткий и понятный синтаксис, строгая типизация и
сборщик мусора позволяют сосредоточиться на
разработке, не отвлекаясь на что-то ещё.

Богатейшая экосистема позволяет выбрать готовые
строительные кирпичики, чтобы повторно не
изобретать велосипед.
Ссылки

http://pypl.github.io/PYPL.html

http://githut.info/

https://github.com/blog/2047-language-trends-on-github

http://blog.codeeval.com/codeevalblog/2016/2/2/most-popula

https://www.indeed.com/jobtrends/q-java-q-python-q-javascrip

https://zeroturnaround.com/rebellabs/java-tools-and-technolo

https://mvnrepository.com/popular

https://zeroturnaround.com/rebellabs/java-tools-and-technolo
Благодарю за внимание!! :)

Mais conteúdo relacionado

Mais procurados

Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Anton Moiseenko
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptAnton Moiseenko
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Anton Moiseenko
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.Igor Shkulipa
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Anton Moiseenko
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в javaUnguryan Vitaliy
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1Technopark
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.Igor Shkulipa
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
курс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключениякурс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключения7bits
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.Unguryan Vitaliy
 

Mais procurados (20)

Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.ppt
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
курс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключениякурс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключения
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 

Destaque

Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrencyPavel Titkov
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Nikita Lipsky
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Javaaragozin
 
Backendless BaaS. Dinosaurus for Jeeconf 2013
Backendless BaaS. Dinosaurus for Jeeconf 2013Backendless BaaS. Dinosaurus for Jeeconf 2013
Backendless BaaS. Dinosaurus for Jeeconf 2013backendless
 
WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)Igor Khotin
 
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)Robert Scholte
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaNikita Lipsky
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8Alexey Zinoviev
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Nikita Lipsky
 
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейSkillFactory
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8Ilya Lapitan
 
Программа Еxecutive МВА «Новые управленческие стратегии и GR-технологии»
Программа Еxecutive МВА «Новые управленческие стратегии и GR-технологии»Программа Еxecutive МВА «Новые управленческие стратегии и GR-технологии»
Программа Еxecutive МВА «Новые управленческие стратегии и GR-технологии»BusinessofRussia
 
Креативные методики
Креативные методикиКреативные методики
Креативные методикиRed Keds
 
Перепланировки: как сделать правильно.
Перепланировки: как сделать правильно.Перепланировки: как сделать правильно.
Перепланировки: как сделать правильно.SOPRAKTIKA
 
communication structure of the resort area
communication structure of the resort areacommunication structure of the resort area
communication structure of the resort areaVlad Shulaev
 
Java 9 Modularity and Project Jigsaw
Java 9 Modularity and Project JigsawJava 9 Modularity and Project Jigsaw
Java 9 Modularity and Project JigsawComsysto Reply GmbH
 

Destaque (20)

Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
Jeeconf 2015
Jeeconf 2015Jeeconf 2015
Jeeconf 2015
 
Backendless BaaS. Dinosaurus for Jeeconf 2013
Backendless BaaS. Dinosaurus for Jeeconf 2013Backendless BaaS. Dinosaurus for Jeeconf 2013
Backendless BaaS. Dinosaurus for Jeeconf 2013
 
WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)
 
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на Java
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8
 
Java - основы языка
Java - основы языкаJava - основы языка
Java - основы языка
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
 
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
 
Программа Еxecutive МВА «Новые управленческие стратегии и GR-технологии»
Программа Еxecutive МВА «Новые управленческие стратегии и GR-технологии»Программа Еxecutive МВА «Новые управленческие стратегии и GR-технологии»
Программа Еxecutive МВА «Новые управленческие стратегии и GR-технологии»
 
Креативные методики
Креативные методикиКреативные методики
Креативные методики
 
Перепланировки: как сделать правильно.
Перепланировки: как сделать правильно.Перепланировки: как сделать правильно.
Перепланировки: как сделать правильно.
 
communication structure of the resort area
communication structure of the resort areacommunication structure of the resort area
communication structure of the resort area
 
Java 9 Modularity and Project Jigsaw
Java 9 Modularity and Project JigsawJava 9 Modularity and Project Jigsaw
Java 9 Modularity and Project Jigsaw
 

Semelhante a Java: вчера, сегодня, завтра

Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4HighLoad2009
 
Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...jazzteam
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковCodeFest
 
1. java lecture intro
1. java lecture intro1. java lecture intro
1. java lecture introMERA_school
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1Technopark
 
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2SeleniumAgile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2Seleniumjazzteam
 
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко ДмитрийSolit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрийsolit
 
15 HappyDev-lite-2015 autumn. Анна Тарасенко. Java в современном мире, вторая...
15 HappyDev-lite-2015 autumn. Анна Тарасенко. Java в современном мире, вторая...15 HappyDev-lite-2015 autumn. Анна Тарасенко. Java в современном мире, вторая...
15 HappyDev-lite-2015 autumn. Анна Тарасенко. Java в современном мире, вторая...HappyDev-lite
 
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0beloslab
 
Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?GetITAbroad
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОFedor Malyshkin
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionNikita Lipsky
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не толькоCodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не толькоCodeFest
 
F# функциональный язык "новой" волны
F# функциональный язык "новой" волныF# функциональный язык "новой" волны
F# функциональный язык "новой" волныArtem Prysyazhnuk
 

Semelhante a Java: вчера, сегодня, завтра (20)

0. hello java world
0. hello java world0. hello java world
0. hello java world
 
Lesson 01
Lesson 01Lesson 01
Lesson 01
 
TypeScript
TypeScriptTypeScript
TypeScript
 
WebAssembly
WebAssemblyWebAssembly
WebAssembly
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
 
Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиков
 
1. java lecture intro
1. java lecture intro1. java lecture intro
1. java lecture intro
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2SeleniumAgile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
 
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко ДмитрийSolit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
 
15 HappyDev-lite-2015 autumn. Анна Тарасенко. Java в современном мире, вторая...
15 HappyDev-lite-2015 autumn. Анна Тарасенко. Java в современном мире, вторая...15 HappyDev-lite-2015 autumn. Анна Тарасенко. Java в современном мире, вторая...
15 HappyDev-lite-2015 autumn. Анна Тарасенко. Java в современном мире, вторая...
 
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
 
Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?Что такое Java? Кто такой Java разработчик?
Что такое Java? Кто такой Java разработчик?
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПО
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не толькоCodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
 
F# функциональный язык "новой" волны
F# функциональный язык "новой" волныF# функциональный язык "новой" волны
F# функциональный язык "новой" волны
 

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  Популярность росла вместе с интернетом
  • 8. Девиз «Написан однажды — работает везде» «Write Once, Run Anywhere»
  • 9. Код Java (.java)Код Java (.java) Компилятор JAVAC Компилятор JAVAC Байт-код (.class)Байт-код (.class) JVMJVM JVMJVM WindowsWindows LinuxLinux MacMac JVMJVM
  • 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.  Название языка происходит от марки кофе.  Другая версия утверждает, что это отсылка к кофе-машине, одному из приборов, для которого это язык и разрабатывался. Язык мог и до нашего времени называться «Дубом», но эта торговая марка уже была зарегистрирована.
  • 14. Основные характеристики Java  Простота  Объектная-ориентированность  Распределённость  Устойчивость  Безопасность  Независимость от системы  Мобильность  Интерпретируемость  Высокая эффективность  Многопоточность  Динамичность
  • 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 очень продвинутые.  Они тщательно оптимизируют код  И даже выбрасывают ненужное Байт-код будет выполнять в точности то, что было запрограммировано, но, при декомпиляции, исходный код не всегда совпадает с тем, что написал программист. тестирование
  • 22. Мобильность  Независимость от платформы  Лёгкость переноса исходного кода программы, или скомпилированного кода * при условии, что для целевой платформы имеется JVM. Типы, правила повышения
  • 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
  • 30. J2SE 1.3 (Kestrel) 08.05.2000  Виртуальная машина HotSpot  JavaSound  Синтетические классы  Java Naming and Directory Interface (JNDI)  StrictMath  Timer API
  • 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 тут вне конкуренции, хотя, для нашего времени на графике видно резкое падение индекса обоих языков.
  • 44. Indeed.com Если посмотреть на рынок труда, то мы увидим, что спрос на программистов Си и Java очень высок:
  • 45. Indeed.com Больше всего ищут работу Джависты:
  • 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 рвут всех своих ближайших конкурентов:
  • 81. Тенденции последних лет говорят о том, что популярность Spring только растёт:
  • 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#.  Чёткий и понятный синтаксис, строгая типизация и сборщик мусора позволяют сосредоточиться на разработке, не отвлекаясь на что-то ещё.  Богатейшая экосистема позволяет выбрать готовые строительные кирпичики, чтобы повторно не изобретать велосипед.