Descompilé la inferencia de tipo de variable local de Java 10

Descompilé la inferencia de tipo de variable local de Java 10

Haga clic en "Hollis" arriba para seguirme, y el contenido emocionante se presentará de inmediato.
Texto completo: 2500 Tiempo de
lectura: 5 minutos,
hora de Beijing, el 21 de marzo, Oracle anunció oficialmente el lanzamiento oficial de Java 10. Este es el primer lanzamiento oficial después del ciclo de versiones principales de Java. Con respecto a Java 10, una de las nuevas características que merece la atención de los programadores es probablemente la inferencia de tipo de variable local.

Después del lanzamiento de Java 10, también han aparecido muchos artículos que nos dicen qué características hay y cómo usar la inferencia de tipo de variable local. Sin embargo, para saber por qué, debemos saber por qué.

Después del lanzamiento de Java 10, descargué esta versión de Jdk y la instalé en mi computadora por primera vez, luego escribí un fragmento de código e intenté descompilarlo, y realmente sentí lo local que es la inferencia de variables. Este artículo habla brevemente sobre mis sentimientos.

principio


Con respecto al uso de la inferencia de tipo de variable local, lo he introducido en mi "Java 10 se lanzará este mes, cambiará la forma en que escribe el código". Se puede utilizar en los siguientes escenarios:

public class VarDemo {

   public static void main(String[] args) {
       //初始化局部变量  
       var string = "hollis";
       //初始化局部变量  
       var stringList = new ArrayList<String>();
       stringList.add("hollis");
       stringList.add("chuang");
       stringList.add("weChat:hollis");
       stringList.add("blog:http://www.hollischuang.com");
       //增强for循环的索引
       for (var s : stringList){
           System.out.println(s);
       }
       //传统for循环的局部变量定义
       for (var i = 0; i < stringList.size(); i++){
           System.out.println(stringList.get(i));
       }
   }
}

Luego, use el comando javac de java 10 para compilar:

/Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home/bin/javac VarDemo.java

Generamos el archivo VarDemo.class, descompilamos VarDemo.class. Descompile con jad para obtener el siguiente código:


public class VarDemo
{
   public static void main(String args[])
   {
       String s = "hollis";
       ArrayList arraylist = new ArrayList();
       arraylist.add("hollis");
       arraylist.add("chuang");
       arraylist.add("weChat:hollis");
       arraylist.add("blog:http://www.hollischuang.com");
       String s1;
       for(Iterator iterator = arraylist.iterator(); iterator.hasNext(); System.out.println(s1))
           s1 = (String)iterator.next();

       for(int i = 0; i < arraylist.size(); i++)
           System.out.println((String)arraylist.get(i));

   }
}

Este código nos es muy familiar, es el código escrito antes de Java 10 cuando no hay inferencia de tipo de variable local. La relación correspondiente del código es la siguiente:

本地变量类型推断写法  正常写法
var string = "hollis";  String string = "hollis";
var stringList = new ArrayList();   ArrayList stringList = new ArrayList();
for (var s : stringList)    for (String s : stringList)
for (var i = 0; i < stringList.size(); i++) for (int i = 0; i < stringList.size(); i++)
ArrayList arraylist = new ArrayList(); 其实是
ArrayList<String> stringList = new ArrayList<String>();解糖后,类型擦除后的写法。

for(Iterator iterator = arraylist.iterator(); iterator.hasNext(); System.out.println(s1)) 其实是 for (String s : stringList) 这种for循环解糖后的写法。

Por lo tanto, la inferencia de tipo de variable local también es un azúcar sintáctico proporcionado a los desarrolladores por Java 10. Aunque usamos var en el código para definir, pero para la máquina virtual, él no reconoce esta var. En el proceso de compilar el archivo java en un archivo de clase, resolverá el azúcar y usará el tipo real de la variable para reemplazar la var ( Como usar String string para reemplazar var string). En el caso de la máquina virtual, no es necesario realizar cambios de compatibilidad en var, porque su ciclo de vida finaliza en la fase de compilación. El único cambio es que el compilador necesita agregar una operación extra de resolución de azúcar en var durante el proceso de compilación.

Los estudiantes interesados ​​pueden escribir dos piezas de código, una con var y otra sin var, y luego comparar el código de bytes compilado. Descubrirá que es exactamente lo mismo. La siguiente figura es el resultado de mi comparación con la herramienta de diferencias.
Descompilé la inferencia de tipo de variable local de Java 10


语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。

¿Cuál es la diferencia con JavaScript?


Mucha gente sabe que en JavaScript, la definición de variables se declara usando var. Entonces, tan pronto como salió la inferencia de tipo de variable local de Java 10, algunas personas dijeron, ¿no es esto copiar JavaScript? ¿No es lo mismo que var en JS?

De hecho, es realmente diferente.

En primer lugar, JavaScript es un lenguaje de tipado débil (o dinámicamente tipado), es decir, el tipo de variable es incierto. Puede utilizar la sintaxis "5" -4 en JavaScript, y su resultado es el número 1, donde se calculan la cadena y el número. Si no lo cree, abre la consola de su navegador y pruébalo:
Descompilé la inferencia de tipo de variable local de Java 10

Sin embargo, aunque se puede utilizar var para declarar variables en Java, sigue siendo un lenguaje fuertemente tipado. A través del código descompilado de arriba, ya sabemos que var es solo un azúcar sintáctico proporcionado por Java a los desarrolladores Finalmente, después de la compilación, el tipo de objeto definido por var debe definirse como el tipo inferido por el compilador.

¿Afectará la legibilidad?


La inferencia de tipo de variable local es probablemente la más criticada por su legibilidad, porque antes, cuando definimos una variable, debemos especificar claramente su tipo, por lo que cuando lees el código, puedes saber su tipo mirando su tipo declarado. , Pero después de todo, use var, será miserable. No hay duda de que esto perderá parte de la legibilidad. Sin embargo, usar var para declarar objetos en el código también trae muchos beneficios, como un código más conciso.

Antes de que salga algo nuevo, siempre habrá todo tipo de malestar. Ahora todos sienten que esto también afecta mi eficiencia en la lectura de código. Al igual que cuando Taobao Mall acaba de cambiar su nombre a Tmall, todos pensaron que era un nombre fantasma. Estoy acostumbrado a escuchar ahora, ¿crees que es bastante bueno?

Si todo el mundo usa var para declarar variables, entonces el nombre de la variable se vuelve más importante. En ese momento, todos prestarán más atención a la legibilidad de los nombres de las variables. Además, creo que en un futuro próximo, los principales IDE lanzarán la función de tipo inferido de variables de visualización inteligente. Por tanto, en todos los aspectos, se pueden subsanar algunas deficiencias.

En resumen, estoy adoptando más activamente la característica de la inferencia de tipo de variable local.

Pensando


Finalmente, me gustaría hacer una pregunta más para que todos puedan pensar. La inferencia de tipo de variable local parece ser bastante fácil de usar, y dado que Java ha decidido lanzarlo en la nueva versión, ¿por qué debería limitar su uso? Los pocos escenarios conocidos en los que se puede utilizar var para declarar variables son para inicializar variables locales, mejorar el índice del bucle for y definir las variables locales del bucle for tradicional. También hay varios escenarios que no admiten este uso, como:
parámetros de método
el constructor de parámetros
devuelve el tipo de
objeto de variable miembro del método ,
así que mi pregunta es, ¿por qué estas restricciones son Java, qué consideración es esa? Los estudiantes confiables son recompensados. Llévate gratis a mi planeta del conocimiento. Las discusiones y respuestas sobre esta parte de las preguntas de pensamiento también se llevarán a cabo en Knowledge Planet.

-MÁS | Más artículos interesantes-

  • El camino del ingeniero de Java para convertirse en dios (revisión 2018)
  • 8 tecnologías de sitios web *** que el desarrollo de Java debe dominar
  • El artículo más completo de toda la red para analizar el hash () en Map
  • Tecnología de arquitectura de sitios web a gran escala de un vistazo

Si ve esto, le gusta este artículo.

Luego, presione y mantenga presionado el código QR para seguir a Hollis

Descompilé la inferencia de tipo de variable local de Java 10

Supongo que te gusta

Origin blog.51cto.com/13626762/2545042
Recomendado
Clasificación