Pull to refresh

Scala как расширенная Java или Java++

Reading time 4 min
Views 27K
Java существует достаточно долго, на ней написано огромное количество софта и она является лидером в своей области. Однако Java не лишена недостатков. При проектировании языка важным критерием была простота и легкость изучения языка, и эта простота заставляет писать огромное количество лишнего кода, что бы компенсировать недостаточную гибкость языка: паттерны проектирования, XML конфиги, AOP, гетеры-сеттеры, try catch finaly синтаксис и т.д. Так же очевидно что не для всех задач чистый ООП подход является оптимальным, некоторые задачи намного эффективнее выполнять в функциональном стиле.

Существует много разных языков — Groovy, Python, Ruby, JRuby и еще много других, которые потенциально могут заменить java. Так почему же именно Scala?

  • Scala очень похожа синтаксисом на Java. Практически все возможности Java в Scala реализуются точно таким же или похожим образом, благодаря этому уменьшается порог вхождения в язык.
  • Scala тоже является языком со строгой статической типизацией. Статическая типизация помогает когда над проектом начинают работать большие команды на протяжении большого промежутка времени.
  • Производительность. Согласно исследованиям Scala имеет практически такую же производительность как и java. Где-то чуть быстрее, где-то медленнее, но общая картина такова что скорость выполнения кода на этих языках примерно одинакова.
  • Полная совместимость с java — библиотеками. Т.е. вы можете использовать любую библиотеку, написанную на Java в Scala, что избавляет вас от изобретения велосипедов. И так же делает переход на Scala более приятным — вы ведь все еще можете использовать старые, привычные библиотеки, API которых вам знаком.
  • Scala — более высокоуровневый язык. Вы описываете что нужно делать, а не как это нужно делать. Высокоуровневый код проще читать, писать, поддерживать и он занимает меньше места.

Теперь список главных фишек в Scala, которых нету в Java:

Каждая из этих фишек является незначительным улучшением, без которого вполне можно было бы обойтись, но все вместе они формируют очень мощный инструмент. Но каким образом это влияет на процесс программирования?

В разы более мощный инструментарий для разработчиков библиотек. Эффективность разработки на каком-либо языке определяется в большей степени наличием готовых библиотек. Какой толк от языка, если придется на нем придется разрабатывать все с нуля? Возможность разрабатывать свои DSL, implicit параметры и преобразования, функции высшего порядка, мощная система типов позволяют писать более гибкие и мощные библиотеки, которыми удобнее пользоваться. Но даже если на Scala еще не написана нужная вам библиотека, вы можете просто использовать библиотеку из Java.

Высокоуровневая работа с коллекциями. Благодаря наличию замыканий для большинства манипуляций с коллекциями (отфильтровать, сделать выборку, проверить все элементы на условие, разбить на группы и т.д) существуют отдельные методы. Это позволяет в 95% использовать уже готовые библиотечные методы, в то время когда на Java вам необходимо писать те же самые операции каждый раз самому.

Лаконичность динамического программирования. Благодаря implicit'ам, неявному выводу типов и богатому синтаксическому сахару ваш код начинает выглядеть почти так-же лаконично как если бы вы писали на динамическом языке типа Groovy или Ruby. При этом каждая переменная имеет свой тип и компилятор вам подскажет если вы будете делать что-то не так.

Меньшее количество неинформационного шума. Это как раз тот момент где общая картина складывается из мелочей. В Scala очень много моментов где она позволяет писать на несколько символов меньше. На выходе получается примерно в 2-3 раза меньше кода, чем на Java без потери читабельности!

Поддержка многих паттернов проектирования на уровне синтаксиса. Хотите синглетон — меняет слово «class» на «object», хотите фабрику — используйте конструктор со значениями по умолчанию и именными параметрами, хотите команду — просто передаете замыкание и т.д.

Более понятный и структурированный код бизнес-логики. Не все можно описать на высоком уровне, бывает логика с большим количеством if /else, проверок, условий, выделением дополнительных вспомогательных методов. Благодаря паттерн-матчингу, монадам, функциям высшего порядка, вложенным методам такая логика получается в разы читабельнее. Когда в Java необходимо сделать много if / else / switch проверок в Scala можно использовать паттерн матчинг, когда в Java необходимо заимплементить интерфейс и добавить класс в конфигурацию, в Scala нужно просто передать замыкание, когда в Java идут проверки на null и обработка ошибок в Scala используются монады, когда в Java создаются классы Utils, фабрики, интерфейсы с глобальными переменными, сигнглетоны в Scala создается объект-компаньен.

Заключение


Я не утверждаю что Java является абсолютным злом. Напротив, это прекрасный язык, он был огромным шагом вперед для своего времени, однако время идет и все меняется, появляются новые технологии, старые устаревают. И нам, программистам, нужно двигаться вперед и изучать новые, более совершенные инструменты. И Scala отлично подходит на эту роль, она лишена большинства недостатков Java и имеет очень много новых возможностей с помощью которых программист может качественнее выражать свои мысли и значительно увеличить свою продуктивность.
Tags:
Hubs:
+28
Comments 58
Comments Comments 58

Articles