Mama Java – Telegram
Mama Java
37 subscribers
5 links
Канал о разработке на Java и всём, что ее окружает
Download Telegram
Channel created
👋Здравствуй, приятель, рада приветствовать тебя на своём канале, посвященном языку Java, программированию, информационным технологиям и прочим занятным вещицам.

Несколько слов об авторе канала. Меня зовут Вероника Алексеевская, я профессионально занимаюсь разработкой на Java с 2016 года. На момент публикации данного поста являюсь заместителем руководителя группы разработки в крупном банке.
vk
linkedin
сетка
github
🍀
1
...Мне посчастливилось работать на проекте, где использовалось все многообразие версий Java, поэтому первый пост я хочу начать с немного более пристального рассмотрения этих самых версий.
Итак: "что было".
Официальным днем рождения Java считается 23 мая 1995 года. Однако до официальной версии Java 1.0 было еще далеко - она была выпущена только 23 января 1996 года. Затем примерно раз в 2-3 года выходили новые версии. Поначалу им даже давали прикольные названия - например:
1.1.4 - Sparkler (бенгальский огонь 🎇),
1.1.5 - Pumpkin (тыква 🎃- релиз был вскоре после Хэллоуина),
1.3.0 - Kestrel (пустельга 🐦),
1.3.0_01 - Firefly (светлячок🪲),
1.3.1 - Ladybird (божья коровка 🐞),
1.4.0 - Merlin (имелся в виду не волшебник из легенд о короле Артуре, а североамериканский мелкий сокол - дербник 🦅),
1.4.1 - Hopper (сокращение от grasshopper - кузнечик 🦗)
1.4.2 - Mantis (богомол; наверное, подразумевалось, что версия - отвал башки😆; видимо, так и есть - в 2024 году все еще встречаются проекты, где она до сих пор используется, хотя сама Java 1.4.2 вышла в 2003 году 😱).
Начиная с Java 1.5, в официальной индексации решили отбросить 1, и после Java 1.4 вышла уже Java 5.0. Так что де-факто мы с вами все еще используем Java 1, кто бы что ни говорил! Кстати аж до Java 9 - команда 'java -version' показывала эту major-версию: "Java(TM) SE Runtime Environment (build 1.8.0_191-b12)".

🐯 Версия 5.0 (2004) получила имя Tiger (тигр). В ней в языке появилось много всяких полезных штук, которые сейчас кажутся настолько повседневными, что непонятно как без них жили древние люди:
- обобщения (было ArrayList - стало ArrayList<Integer>),
- перечислимые типы (enum),
- аннотации (например, @ Override),
- методы с неопределённым числом параметров (varargs, например, print(String… words))
- автоматическое преобразование между примитивными типами и обертками (писать Integer g = 4 и int f = new Integer(4) - стало легально!),
- foreach ( который for (T t : array) {}).

🐎 В 2006 году в официальной индексации решили отбросить и minor-версию в названии продукта (к слову сказать, в 5.0 она уже не использовалась, а все обновления обозначались через u (update) - например, 5.0u10 ). Java 6, вышедшая в этом году - получила имя Mustang (мустанг). В этой версии много чего пофиксили и улучшили, добавили JConsole в JDK, но с точки зрения именно языка мало что поменялось: появились интерфейсы коллекий Deque, BlockingDeque, NavigableSet, NavigableMap, ConcurrentNavigableMap и их реализации и, собственно, на этом все.

🐬 Следующая версия Java 7 - Dolphin (дельфин) вышла аж через через 4.5 года после предыдущей. После этого фантазия разработчиков на имена иссякла и новые версии языка больше не получали красивых названий. А зря, это было очень мило🥲! В этой версии было много изменений, касающихся JVM, добавились пакеты ввода-вывода файлов - java.nio.file, java.nio.file.attribute и java.nio.file.spi, алгоритм сортировки слиянием в коллекциях заменили на Timsort, а сам язык получил следующие фичи:
- в switch стало возможно использование String
- try-with-resources (например,так: try(FileOutputStream output = new FileOutputStream(path)){…})
- множественная обработка исключений (типа такого: catch (IllegalArgumentException|SecurityException | IllegalAccessException e))
- оператор <> (diamond operator) - было так: ArrayList<Integer> arrayList =new ArrayList<Integer>() - стало так: ArrayList<Integer> arrayList = new ArrayList<>()
- подчёркивания в числовых литералах для лучшего восприятия больших чисел (было так: int speedOfLight = 299792458; а стало так: int speedOfLight = 299_792_458;)
- двоичные литералы (например, int binaryNum = 0b111; - 0b - показывает, что используется двоичное число)

Следующая версия Java - 8 была выпущена еще через 3 года - в 2014 году. С тех пор прошло 10 лет, но на самом деле, многие компании до сих пор продолжают работать именно с этой версией Java. Но об этом - в следующей серии!
🍀
👍1
В прошлой серии мы окунулись в далекое прошлое Java, теперь взглянем на недавнее.
Итак: "что было еще".
🐁На дворе стоял март 2014 года, недавно отгремела Сочинская олимпиада, в кинотеатрах вовсю рекламировали Интерстеллар и Стражей Галактики, а доллар был по 35. И вот в один из самых обычных дней - 18 марта 2014 мир увидел многими любимую великую и ужасную прекрасную Java 8.🐁Эта версия замечательна тем, что там появилось столько классных фич, что жизнь разработчиков буквально разделилась на до и после! 🥲 На самом деле, сейчас многие компании продолжают использовать именно Java 8 (а некоторые даже на нее только переходят с более старых версий). И, да, это минимальная версия Java, которая необходима для работы в большинстве компаний.
Вот что важного появилось в этой версии:
- лямбда-выражения и функциональные интерфейсы (например: Runnable newRunnable = () -> System.out.println("Hello new world!");)
- ссылки на методы (например: AbstractHttpConfigurer::disable, System.out::println) - метод по умолчанию для интерфейсов (раньше все методы интерфейсов были public abstract, теперь же, обозначив метод ключевым словом default, можно написать его реализацию - его получат все классы, реализующие этот интерфейс)
- операции в функциональном стиле для коллекций, более известные как Stream API (теперь то, что выполнялось раньше в цикле, теперь можно написать в одну строку, например так list. stream().filter(name -> name.startsWith("a")).map(String::toUpperCase).sorted().forEach(System.out::println);)
- Optional - обертка объекта, который может быть null (долой Null Pointer Exception!)
- аннотации типов и повторяющиеся аннотации - новый API для работы с датой и временем (java.time)
- Base64 декодер (java.util.Base64)
По подробному разбору каждого пункта написаны уже наверное сотни статей и книг, поэтому останавливаться подробно я здесь на этом не буду. Добавлю только, что помимо улучшений языка, была сделана масса улучшений, касающихся безопасности, JavaFX, IO и NIO и многопоточности.

🐁Следующая версия, Java 9 (первая не LTS версия), была выпущена через 3.5 года - 21 сентября 2017 года. И вот что она нам принесла:
- в коллекциях у List, Set и Map появился метод of(…) создающий неизменяемый объект соответствующего типа (например: List<Integer> list = List.of(1, 2, 3, 4);)
- в Stream API добавились новые методы dropWhile, takeWhile, ofNullable и iterate.
- в интерфейсах стало можно создавать private методы - добавилась API Reactive Streams - для асинхронной обработки данных в потоковом стиле
- HTTP/2-клиент - до этого встроенная поддержка Http в Java была довольно низкоуровневой, а также имела множество проблем.Также в этой версии появилась такая замечательная штука как JShell - теперь, чтобы выполнить какой-то кусочек кода на Java, вообще не нужно создавать классы, main-ы, чего-то там компилировать и вообще шевелиться! 🐁Нужно лишь вызвать в командной строке jshell и вуаля! - можно выполнять команды на Java и моментально видеть результаты: jshell>System.out.println("Ничоси!"). В JShell можно определить также и классы, и функции, и переменные. 😎

🐁Спустя всего полгода после выхода Java 9 - была выпущена уже следующая версия, Java 10. Там было сделан ряд улучшений относительно сборщика мусора - в частности появился Garbage-Collector Interface, интерфейс сборщика мусора в исходном коде JVM, позволяющий легко интегрировать альтернативные сборщики мусора, а также сборщиком мусора по умолчанию стал G1.Но фактически наиболее заметное для разработчиков изменение заключалось во введении ключевого слова var, которое позволяет не указывать тип переменной (например, var car = "Porsche"). Нет, Java все еще (и слава богу!) статически типизирована - var применяется только к переменным внутри методов, а компилятор определяет тип во время компиляции.

Начиная с Java 10 скорость выхода новых версий увеличилась - теперь последняя версия меняется раз в полгода, а отличия между версиями перестали быть настолько существенными. Но об этом - в следующей части!
🍀
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
☕️ Продолжаем нашу историю эволюции Java.
(https://vk.com/@-226906615-i-esche-pro-versii-java-11)


Итак: «… чем сердце успокоится»😄
Начиная с Java 11 в сентябре 2018, у релизов появилось четкое расписание - теперь каждый март и сентябрь разработчиков поджидает что-то новенькое.

🍏 Итак, чего же заметного мы получили в Java 11:
- Появилась возможность запускать исходные файлы Java без предварительной компиляции (прям вот так: java Main.java)
- Поддержка var в параметрах лямбда-выражений (вроде такого: <…>.map((var txt) -> txt.toUpperCase()).<…>)
- В Java.util.Collection появился toArray, принимающий аргумент IntFunction (вот так: String[] arr = list.toArray(String[]::new))
- Новые методы для работы со строками и со строками в файлах
Также из интересного - в Java 11 появился Java Flight Recorder (JFR) - инструмент для сбора диагностических данных из работающего приложения Java и No-Op сборщик мусора курильщика Epsilon (который на самом деле ничего не собирает, но зато применим для имитации ошибок нехватки памяти).

🍎 Следующая версия Java 12 - вышла в марте 2019, в ней было добавлено еще несколько новых функций для строк(indent, transform в классе String) и файлов (mismatch в nio.file.Files), но, пожалуй, самое заметное - это поддержка Unicode 11, а так же новый синтаксис switch со стрелочками (правда, пока в формате превью).
Также из интересного: добавился новый форматировщик чисел - CompactNumberFormat: из коробки можно получить, например, из числа 5500 текст "5.5 тысяч".

🍋‍🟩 В сентябре 2019 вышедшая Java 13 пополнила арсенал разработчиков следующей классной штукой (опять же пока в формате превью): появились текстовые блоки (забываем про переносы в стиле +"\n" - пишем тройные кавычки и наслаждаемся жизнью).

🍐 В марте 2020 вышла Java 14, и вот что замечательного мы получили:
- Обновленный switch стал доступен в основной версии
NullPointerExceptions теперь точно сообщает, кто конкретно null
- В формате превью: паттерн-матчинг для instanceof (то есть: if(obj instanceof String str) {})
- В формате превью: записи (класс, записанный как public record Person (String name, String surname) {} - содержит уже конструктор, геттеры, toString и hashCode)
Также был сделан рад изменений, касательно JVM и управления памятью и добавлен экспериментальный сборщик мусора Z.

🍊 Java 15 в сентябре 2020 содержала следующие основные изменения:
- Текстовые блоки (те, что с тройными кавычками) из Java 13 перенесли из превью в основную версию
- Sealed классы (например, public abstract sealed class Pet permits Cat, Dog - только Cat и Dog могут создавать подклассы Pet) - пока что в формате превью

🍋 В Java 16, вышедшей в марте 2021, было сделано следующее:- Перенесли в основную версию паттерн-матчинг для instanceof и записи (records) из Java 14,
- Добавили toList() в Stream - чтоб покороче писать было (вместо .collect(Collectors.toList() стало .toList())- Сделали небольшие изменения в DateTimeFormatter
Ну и всякое по мелочи😄.

🍓 В сентябре 2021 вышла Java 17 с долгосрочной поддержкой (LTS), и вот что интересного там произошло:- Sealed классы из Java 15 перенесли в основную версию
- Добавили паттерн-матчинг для switch (типа такого: switch(obj) {(…) case Cat c -> "A Cat";…) ) - как водится в формате превью.

🍉 22.03.2022 вышла Java 18, в которой из заметного стало: использование кодировки UTF-8 по умолчанию (раньше использовалась кодировка операционной системы), а также файловый HTTP-сервер с простой настройкой и минимальным функционалом (jwebserver).
👍2
🍑 В Java 19 в сентябре 2022 добавили несколько интересных штук (опять в режиме превью)

- Паттерны записей (o instanceof Point(int x, int y) {})
- В паттерн-матчинг switch - охранные паттерны && были заменены на условия when (было case Integer x && x > 0 -> …; стало case Integer x when x > 0 -> …;) и null матчится категорически только в ветке case null
- Виртуальные потоки
- Foreign Function & Memory API

🥭 В Java 20 в марте 2023 содержала в основном различные улучшения всего, что было добавлено в Java 19.

🥝 В сентябре 2023 вышла Java 21, в ней из заметного:
- Наконец добавили в основную версию виртуальные потоки, паттерны записей и паттерн-матчинг switch,
- Добавили (естественно как превью) строковые шаблоны (например: String str = STR."\{x} is the capital of \{y}";) и безымянные переменные и паттерны (чтоб не придумывать имена),
- Также теперь (в режиме превью) можно запускать программы с методами main(), которые не являются public static и у которых нет параметра String[] args
- Также были сделаны изменения относительно сборщика мусора, шифрования и прочие.

🍒 Следующая версия - Java 22 - вышла в марте 2024 года, и вот что интересного там добавилось:

- Безымянные переменные включили в основную версию (переменная, которая обозначена автором как неиспользуемая и обозначаемая символом подчёркивания (_))Также был сделан ряд прочих изменений, не столь заметных.
- Стало возможным в режиме превью писать инструкции кода в конструкторе перед явным вызовом конструктора (super() или this())
- Теперь можно запускать программы, состоящие из нескольких исходных файлов Java (это развитие фичи из Java 11 - где стало можно запускать исходные файлы без компиляции >java Main.java - теперь Main может содержать вызовы методов других классов и это не приведет к ошибке).

Вот, собственно, и вся история!

Хотя, погодите, на носу сентябрь, а это значит, что буквально через месяц нас ждет новая Java 23 🥳.

Судя по всему, все новшества там ожидаются в режиме превью - в частности добавятся примитивы в шаблоны instanceof и switch и появится возможность импорта целого модуля (import module M).

Но это уже совсем другая история!

🍀
👍5