Semisonic
@Semisonic
Разработчик, выдумщик, неравнодушный человек

Java как язык: есть ли отличия между разработкой для Android и Java SE/EE (февраль 2015)?

Всем привет!

В рамках задачи научиться создавать приложения для Android задался вопросом освоить требуемый инструментарий, в первую очередь сам язык Java.
Прочитав вводную книжку по Java, ориентированную в первую очередь на использование Java SE, заметил, что язык активно развивается, и в нём постоянно появляются различные новые конструкции. Например, в Java 8 появились лямбды.

В связи с этим вопрос: именно как язык, то есть совокупность синтаксиса и грамматики, а также программных конструкций, ими описывающихся, является ли "каноничаская" Java от Oracle идентичной тому языку, на котором пишутся программы для Android? Условно говоря, все эти дженерики, лямбды и аннотации, доступны ли они Android-разработчикам в том же самом виде, что и "обычным" Java-программистам?

Отдельный вопрос - версионность языка. Насколько я понял, в "обычной" Java всё упирается в версию JVM, то есть при написании кода доступный синтаксис определяется той версией виртуальной машины, на которой он будет исполняться.
А что на Android? Всё упирается в версию ОС? Тогда, к примеру, если я создаю приложение, поддерживающее Android начиная с версии 2.1, то мне не только доступно лишь то API, которое существовало на тот момент, но и актуальный на тот момент синтаксис языка, то есть, в моём примере, без лямбд? Или же ограничения касаются лишь API, а компилятор автоматом генерит по новому исходному тексту байткод, который сможет понять даже старая версия Dalvik?

Буду благодарен всем, кто сумеет прояснить этот вопрос.
  • Вопрос задан
  • 9153 просмотра
Пригласить эксперта
Ответы на вопрос 4
Semisonic
@Semisonic Автор вопроса
Разработчик, выдумщик, неравнодушный человек
Вдохновившись предыдущими ответами и заметив некоторые несостыковки мнений у их авторов, отправился на собственные поиски. И вот что мне удалось найти.

Is it possible to use Java 8 for Android development? - вопрос на StackOverflow, датированный апрелем 2014 года. Общая идея ответов следующая:
  • Java от Oracle и язык разработки для Android - де-юре никак не связанные друг с другом вещи. Причина - опять же юридическая, связанная с вопросами лицензирования Java для стороннего использования.
    Как следствие, язык и фреймворк для разработки под Android базируются на проекте Apache Harmony, опенсорсной реализации Java SE, причём на той его ветке, которая реализовывала Java 6.
  • Фичи канонической Java от Oracle появляются в языке разработки для Android спорадически и исключительно по желанию Google, то есть никак не связаны с версионностью Java от Oracle. Де-факто, при работе с Android KitKat и выше можно использовать большинство (хотя, я так понял, не все - к примеру, try-with-resources в пролёте) фишек Java 7.
  • Существующие способы использования новых фишек канонической Java при разработке под Android базируются на различных хитростях процедуры сборки. Например, для поддержки лямбд предлагается использовать нечто под названием gradle-retrolambda, что конвертирует байткод, получающийся при компиляции Java 8 кода, в байткод Java 6/7, после чего этот байткод конвертируется в формат JVM, используемой в Android. Судя по всему, иных фич Java 8, отличных от лямбд, данный метод не поддерживает.
    Иной подход для использования новых возможностей Java при разработке под Android - это альтернативные языки, в частности, Kotlin (gadfi, спасибо за наводку ;)) - продукт компании JetBrains, на базе чьей IDEA нынче строится официальный инструментарий для разработки под Android.


Также интересные соображения на этот счёт можно почерпнуть в другом вопросе на StackOverflow - “Why Apache Harmony” or “How to use Java 8 on Android”
Ответ написан
Комментировать
gadfi
@gadfi
https://gamega.org
Android не поддерживает java8, более того на самом android работает своя версия jvm ─ dalvik, а в android l art (в некоторых более ранних можно было выбирать на устройстве виртуальную машину, в l отказались от dalvik )
почти весь сахар для android не доступен, но если он очень нужен можете посмотреть в сторону kotlin
Ответ написан
Комментировать
ProgramCodePav
@ProgramCodePav
Front-end developer. Love open source
Верно последнее высказывание.
Все одинаково. Не важна версия языка. Разница между версиями android заключается в API. Для поддержки очень старыми версиями android современных возможностей используется Support Library.

Допустим, велась разработка на Java 6. Потом пришло обновление до Java 8. Вы переписываете код на Java 8 (оптимизируя только функции и работу Java, а не Android) и все отлично работает.

То есть как язык является именно "каноническим" от Oracle. Но Android, кажется, работает только с Java 6. (поправьте в комментариях, если не так).

В структуре он имеет сходство с Java EE (можете это сразу заметить), но это структура Android-проекта.
Ответ написан
@sputnic
Android Developer
по факту некоторые плюшки седьмой версии доступны но если не ошибаюсь только для 4+ версии андроида
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы