21 марта по пекинскому времени Oracle официально объявила об официальном выпуске Java 10. Это первый официальный выпуск после изменения основного цикла версий Java. Возможно, одной из самых интересных новых функций в Java 10 является вывод типа локальной переменной.
После введения Java 10 вышло много статей, рассказывающих нам, какие функции существуют, и рассказывающих нам, как использовать вывод типа локальной переменной. Однако, если вы это знаете, вы должны знать, почему это так.
После выхода Java 10 я скачал эту версию Jdk и впервые установил ее на свой компьютер, затем написал кусок кода и попытался его декомпилировать, чтобы реально почувствовать, что такое вывод локальных переменных. В этой статье просто говорится о моих чувствах.
принцип
Использование определения типа локальной переменной описано в моей статье «Java 10 будет выпущена в этом месяце, и она изменит способ написания кода». В основном его можно использовать в следующих сценариях:
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));
}
}
}
Затем используйте команду javac java 10 для компиляции:
/Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home/bin/javac VarDemo.java
Создается файл VarDemo.class, и мы декомпилируем VarDemo.class. Декомпилируйте с помощью jad, чтобы получить следующий код:
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));
}
}
Этот код нам очень знаком, это код, написанный до Java 10, когда не было вывода типа локальной переменной. Соответствующее отношение кода выглядит следующим образом:
Написание вывода о типе локальной переменной | нормальное письмо |
---|---|
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 stringList = new ArrayList(); после удаления сахара введите стирание.
for(Iterator iterator = arraylist.iterator(); iterator.hasNext(); System.out.println(s1)) на самом деле является циклом for (String s : stringList) for после записи сахара.
Таким образом, вывод типа локальной переменной также является синтаксическим сахаром, предоставляемым Java 10 разработчикам. Хотя мы используем var для определения его в коде, он не знает этот var для виртуальной машины.В процессе компиляции java-файла в файл класса он будет де-сахарить и использовать реальный тип переменной для замены var (например, использование строки String для замены строки var). Для виртуальной машины совершенно нет необходимости вносить какие-либо изменения совместимости в var, потому что ее жизненный цикл заканчивается на этапе компиляции. Единственное изменение заключается в том, что компилятору необходимо добавить еще одну операцию удаления сахара для var в процессе компиляции.
Заинтересованные студенты могут написать два фрагмента кода, один с var и один без var, а затем сравнить скомпилированный байт-код. Вы обнаружите, что это точно так же. На картинке ниже результат моего сравнения с инструментом diff.
Синтаксический сахар (Syntactic Sugar), также известный как грамматика, покрытая сахаром, — это термин, изобретенный британским ученым-компьютерщиком Питером Дж. Ландином, который относится к определенной грамматике, добавленной к компьютерному языку.Эта грамматика не влияет на функцию язык, но он более удобен для программистов. Короче говоря, синтаксический сахар делает программы более краткими и читабельными.
Как это отличается от JavaScript
Многие люди знают, что в JavaScript определяют переменную объявлению с использованием VAR. Итак, Java Local Variable Type Sweference 10 только что вышла, некоторые люди говорят, что это не этот плагиат JavaScript? Это JS внутри VAR не то же самое?
На самом деле, это действительно другое.
Во-первых, JavaScript — слабо типизированный (или динамически типизированный) язык, то есть типы переменных не определены. Вы можете использовать синтаксис «5»-4 в JavaScript, и его результатом будет число 1, где вычисляются строка и число. Если вы мне не верите, откройте консоль браузера и попробуйте:
Однако, хотя var может использоваться для объявления переменных в Java, это все же язык со строгой типизацией. Из декомпилированного кода выше мы уже знаем, что var — это просто синтаксический сахар, предоставляемый Java разработчикам.После компиляции тип объекта, определенный var, должен быть определен как тип, выведенный компилятором.
Не повлияет ли это на читабельность? Больше всего критиковали вывод типа локальной переменной за его удобочитаемость, потому что раньше, когда мы определяли переменную, нам приходилось явно указывать ее тип, поэтому при чтении кода нам нужно было только посмотреть на ее объявленный тип, чтобы узнать его тип. , но ведь используй var, будет убого. Несомненно, это потеряет некоторую читабельность. Однако использование var для объявления объектов в коде также дает много преимуществ, таких как более лаконичный код.
Прежде чем новая вещь только вышла, всегда найдутся всякие непривычные к ней. Теперь всем будет казаться, что эта штука слишком сильно влияет на эффективность моего чтения кода. Точно так же, как когда Taobao Mall только что сменил название на Tmall, все думали, что это имя-призрак. Теперь, когда я привык ее слушать, ты думаешь, она хороша?
Если все используют var для объявления переменных, то имя переменной имеет еще большее значение. В то время люди будут уделять больше внимания удобочитаемости имен переменных. Более того, я считаю, что в ближайшем будущем основные IDE запустят функцию выводимого типа интеллектуальных отображаемых переменных. Поэтому со всех сторон он может компенсировать некоторые недостатки.
Короче говоря, я более активно осваиваю функцию вывода типа локальной переменной.
думать
Наконец, еще один вопрос для всех, чтобы подумать, вывод типа локальной переменной кажется очень полезным, и, поскольку Java решила запустить его в новой версии, зачем ограничивать его использование. Теперь известно несколько сценариев, в которых var может использоваться для объявления переменных, для инициализации локальных переменных, улучшения индекса циклов for и определения локальных переменных в традиционных циклах for.Есть также несколько сценариев, которые не поддерживают такое использование, например:
параметры метода
Параметры конструктора
возвращаемый тип метода
переменная-член объекта
Итак, мой вопрос: почему Java делает эти ограничения и каковы соображения? Обсуждения и ответы на эти вопросы также пройдут на Планете Знаний.