Рубрики
Без рубрики

Использование устаревшей – современной Java в приложениях для Android

Kotlin является предпочтительным языком для приложений Android с 2019 года. Двумя годами ранее Google объявил об этом… С тегами java, kotlin, android.

Kotlin является предпочтительным языком для приложений Android с 2019 года. Двумя годами ранее Google объявил о поддержке Kotlin в Android Studio. С тех пор прошло довольно много времени. Итак, почему статья от лета 2021 года все еще посвящена современной Java в приложениях для Android?

Потому что Java все еще присутствует во многих приложениях для Android. Особенно в тех, которые были выпущены до 2017 года. Конечно, многие из них были частично или полностью переведены в Котлин. Но другие этого не сделали. И чем старше приложение, тем старше используемая версия Java. Apache Harmony (библиотека классов которого попала в Android) начиналась как Java 1.5. Итак, очень старые приложения выглядят так: тонны анонимных внутренних классов. Прошло довольно много времени, прежде чем в Java 7 появились такие функции, как Строка s в switch инструкции или попытка с ресурсами и Автоклавируемый стал доступен. Лямбды и потоки Java 8 также не были доступны сразу.

Таким образом, Java-код в приложениях для Android, вероятно, выглядит старше, чем нужно. Мы могли бы, конечно, сказать, что пока этот код не вызывает проблем, нам лучше оставить его в покое. Но если это все еще жизненно важная часть приложения, мы должны относиться к нему так, как мы относимся к новому коду: заботиться о нем. Это может означать:

  • преобразуйте его в Kotlin
  • используйте современную Java особенности

Я не собираюсь сравнивать эти подходы, так как это была бы самостоятельная статья. 😀 Вместо этого я сосредоточусь на последнем варианте. Но прежде чем мы углубимся: речь идет не о Java против Котлин, и это, конечно, не о том, чтобы обсуждать, какой язык программирования лучше. Я просто думаю, что любой код должен быть как можно лучше.

Налаживание отношений

Языковые версии настраиваются в файле уровня модуля build.gradle .

android {
  ...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
  }
  kotlinOptions {
    jvmTarget = '11'
    useIR = true
  }
  ...

Для использования Java 11 нам также необходимо настроить плагин Android Gradle 7.0 , который, кстати требует Ява 11. Это делается в файле уровня проекта build.gradle .

buildscript {
  ...
  repositories {
    google()
    mavenCentral()
  }
  dependencies {
    classpath "com.android.tools.build:gradle:7.0.0"
    ...

Но почему Java 11? Разве мы не видели Java 16 в марте? Java 11 – это первый выпуск долгосрочной поддержки (LTS) после Java 8. Oracle прекратила поддержку Java 8 в январе 2019 года. Следующей LTS-версией станет Java 17, выход которой запланирован на сентябрь 2021 года.

Что есть на складе?

Вкладыши для корзин мы любим писать что-то вроде

var s = resources.getString(R.string.app_name)

Или вал , если s не собирается меняться.

Это возможно, так как Java 10 , тоже:

var s = context.getString(R.string.app_name);

Вы можете сделать s окончательным, если это необходимо. То, что мы видим здесь, называется выводом локального типа. Мило, не правда ли? Пожалуйста, имейте в виду, однако, что это не работает вне блоков, методов и конструкторов.

Java 11 добавляет var для параметров лямбда.

var list = Arrays.asList("Hello", "Android");
var result = list.stream()
    .map((var x) -> x.toUpperCase(Locale.getDefault()))
    .collect(Collectors.joining(", "));

Есть также некоторые новые методы для String : |/пусто() , строки() , полоса() , ведущая полоса() , завершающая полоса() и повтор() . К сожалению, мы не можем их использовать (на момент написания). Это связано с тем, что библиотека классов Android представляет собой комбинацию библиотеки классов Java и пакетов, специфичных для Android. Изменения в библиотеке классов OpenJDK не становятся частью Android автоматически. Вместо этого они подобраны вручную, вроде как. Практически на каждом уровне API происходит перенос некоторых изменений. Например, с уровнем API 31 мы получим сравните Unsigned() в java.lang. Короткий . Он дебютировал в Java 9.

Еще старше – это попытка с ресурсами: одна из самых крутых и, возможно, наименее используемых функций Java 7. Посмотри:

FileInputStream fis = null;
try {
  fis = context.openFileInput("myfile.txt");
  // do some work
} catch (FileNotFoundException e) {
  Log.e(TAG, "something went wrong", e);
}
if (fis != null) {
  try {
    fis.close();
  } catch (IOException e) {
    Log.e(TAG, "something went wrong", e);
  }
}

Да, это кричит шаблонный код . Но как насчет этого?

try (FileInputStream fis = context.openFileInput("myfile.txt")) {
  // do some work
} catch (IOException e) {
  Log.e(TAG, "something went wrong", e);
}

На случай, если вам интересно… Нет, я не забыл о close() . Это делается автоматически. Следующий…

try {
  var fis = context.openFileInput("myfile.txt");
  // do some work
} catch (IOException e) {
  Log.e(TAG, "something went wrong", e);
} catch (IllegalArgumentException e) {
  Log.e(TAG, "something went wrong", e);
} catch (NullPointerException e) {
  Log.e(TAG, "something went wrong", e);
}

Да, здесь определенно что-то не так.

Почему не так?

try {
  var fis = context.openFileInput("myfile.txt");
} catch (IOException |
    IllegalArgumentException |
    NullPointerException e) {
  Log.e(TAG, "something went wrong", e);
}

Начиная с Java 7, один блок catch может обрабатывать более одного типа исключений. Это может уменьшить дублирование кода. И у вас больше нет объяснения для улова ing Бросаемый . 🤣

Другим источником шаблонного кода являются анонимные внутренние классы

Button b = findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
    // do some work
  }
});

Мы можем уменьшить это до:

Button b = findViewById(R.id.button);
b.setOnClickListener(view -> {
  // do some work
});

Как вы видели, некоторые из предрассудков, с которыми все еще сталкивается Java, (в некоторой степени) больше не действуют. Разработчики должны модернизировать свой код. Ты можешь сделать очень многое.

Вывод

Модернизация старого кода Java, несомненно, стоит затраченных усилий. Во-первых, это становится намного легче читать. Во-вторых, вы сможете удалить тонны шаблонного кода. И в-третьих, ваше приложение станет менее подвержено ошибкам. Не веришь мне? Будьте честны, действительно ли ваш код помещает close() внутрь trycatch ?… что ж, тебе следует. И с помощью try-with-ресурсов вы получаете его бесплатно.

Оригинал: “https://dev.to/tkuenneth/enjoying-legacy-modern-java-in-android-apps-3dd6”