Buscar..


Introducción

Android es compatible con todas las funciones de lenguaje Java 7 y un subconjunto de funciones de lenguaje Java 8 que varían según la versión de la plataforma. Esta página describe las nuevas características de idioma que puede usar, cómo configurar correctamente su proyecto para usarlas y cualquier problema conocido que pueda encontrar.

Java 8 cuenta con subconjunto con Retrolambda

Retrolambda le permite ejecutar el código Java 8 con expresiones lambda, referencias de métodos y declaraciones try-with-resources en Java 7, 6 o 5. Lo hace transformando su código de bytes compilado de Java 8 para que pueda ejecutarse en un tiempo de ejecución Java más antiguo.

Características del lenguaje de Backported:

  • Las expresiones Lambda se respaldan convirtiéndolas en clases internas anónimas. Esto incluye la optimización del uso de una instancia de singleton para expresiones lambda sin estado para evitar la asignación repetida de objetos. Las referencias de los métodos son básicamente solo azúcar de sintaxis para las expresiones lambda y se cargan en la parte posterior de la misma manera.

  • Las declaraciones Try-with-resources se devuelven mediante la eliminación de llamadas a Throwable.addSuppressed si la versión del bytecode de destino está por debajo de Java 7. Si desea que se registren las excepciones suprimidas en lugar de que se las trague, cree una solicitud de función y la haremos configurable

  • Objects.requireNonNull llamadas Objects.requireNonNull se reemplazan con las llamadas a Object.getClass si la versión del bytecode de destino está por debajo de Java 7. Las comprobaciones nulas sintéticas generadas por JDK 9 usan Objects.requireNonNull , mientras que las versiones anteriores de JDK usaban Object.getClass .

  • Opcionalmente también:

    1. Los métodos predeterminados se respaldan al copiar los métodos predeterminados en una clase complementaria (nombre de la interfaz + "$") como métodos estáticos, reemplazando los métodos predeterminados en la interfaz con métodos abstractos y agregando las implementaciones de los métodos necesarios a todas las clases que implementan esa interfaz .

    2. Los métodos estáticos en las interfaces se respaldan moviendo los métodos estáticos a una clase complementaria (nombre de la interfaz + "$"), y cambiando todas las llamadas a los métodos para llamar a la nueva ubicación del método.

Limitaciones conocidas:

  • No respalda las API de Java 8

  • Los métodos por defecto de backporting y los métodos estáticos en las interfaces requieren que todas las interfaces con backported y todas las clases que los implementan o que llamen a sus métodos estáticos se carguen con backport, con una ejecución de Retrolambda. En otras palabras, siempre debes hacer una compilación limpia. Además, los métodos predeterminados de backporting no funcionarán a través de módulos o límites de dependencia.

  • Puede interrumpirse si una futura compilación JDK 8 deja de generar una nueva clase para cada llamada invokedynamic . Retrolambda funciona para capturar el código de byte que java.lang.invoke.LambdaMetafactory genera dinámicamente, por lo que las optimizaciones de ese mecanismo pueden interrumpir Retrolambda.

Retrolambda gradle plugin construirá automáticamente tu proyecto de Android con Retrolambda. La última versión se puede encontrar en la página de lanzamientos .

Uso:

  1. Descarga e instala jdk8
  2. Agrega lo siguiente a tu build.gradle
buildscript {
  repositories {
     mavenCentral()
  }

  dependencies {
     classpath 'me.tatarka:gradle-retrolambda:<latest version>'
  }
}

// Required because retrolambda is on maven central
repositories {
  mavenCentral()
}

apply plugin: 'com.android.application' //or apply plugin: 'java'
apply plugin: 'me.tatarka.retrolambda'

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Problemas conocidos:

  • La pelusa falla en archivos java que tienen lambdas. La pelusa de Android no comprende la sintaxis de java 8 y fallará en silencio o en voz alta. Ahora hay un tenedor experimental que soluciona el problema.

  • El uso de los servicios de Google Play hace que Retrolambda falle. La versión 5.0.77 contiene un código de bytes que es incompatible con Retrolambda. Esto debería solucionarse en las versiones más recientes de los servicios de juego, si puede actualizar, esa debería ser la solución preferida. Para solucionar este problema, puede usar una versión anterior como 4.4.52 o agregar -noverify a jvm args.

retrolambda {
  jvmArgs '-noverify'
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow