Статьи

Java 10 — JEP 286: вывод типа локальной переменной

Java 10 не за горами, а RC Build доступен здесь . Функции, предназначенные для этого выпуска, можно найти здесь . Из всех JEP, предназначенных для Java 10, наиболее интересным и наиболее обсуждаемым сообществом разработчиков является 286: Вывод типа локальной переменной .

Что такое вывод типа локальной переменной?

Мы видели в Java 8 , оператор Diamond, который позволил нам написать

1
List<Map data = new ArrayList<Map();

в виде

1
List<Map data = new ArrayList();

где тип на RHS был выведен на основе типа на LHS. Это работало, хотя и в анонимных внутренних классах, что было исправлено в Java 9.

Java 10 идет дальше и говорит следующее:

1
List<Map data = new ArrayList();

можно записать как:

1
var data = new ArrayList();

Вывод типа локальной переменной позволяет разработчику пропустить объявление типа, связанное с локальными переменными (определенными в определениях методов, блоках инициализации, циклах for и других блоках, таких как if-else), и тип выводится JDK.

Где это можно использовать?

Позвольте мне создать пример класса, чтобы показать различные способы использования локального вывода переменных var :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class LegalLocalVarInferenceDemo{
 
    //in a static/instance initialization block
    static {
        var anotherName = "Sanaulla";
        System.out.println("Hello, " + anotherName);
    }
 
    public static void main(String[] args){
 
        //as a local variable
        var name = "Mohamed Sanualla";
        System.out.println("Hello " + name);
 
        var data = new ArrayList();
        data.add(Map.of("key1", "value1", "key2", "value2"));
        data.add(Map.of("key11", "value11", "key22", "value22"));
        data.add("hello");
        System.out.println(data);
 
        System.out.println("********** As iteration variable in enhanced for-loop ***************");
        for ( var object : data){
            System.out.println(String.format("%s of type %s", object, object.getClass().getName()));
        }
 
        System.out.println("********** As looping index in for-loop ***************");
        for ( var i = 0 ; i < data.size(); i++ ){
            var object = data.get(i);
            System.out.println(String.format("%s of type %s", object, object.getClass().getName()));
        }
 
        System.out.println("********** As a return value from another method ***************");
        var anInteger = someAnotherMethod();
        System.out.println("someAnotherMethod returned " + anInteger);
 
    }
 
    //As a return value in a method
    public static Integer someAnotherMethod(){
        System.out.println("someAnotherMethod called");
        var returnObj = 12;
        return returnObj;
    }
 
}

Где это нельзя использовать?

Позвольте мне создать еще один пример класса, который показывает, как нельзя использовать var :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class IllegalLocalVarInferenceDemo{
    //Not permitted in class fields
    //var someProperty;
 
    //Not allowed as parameter for constructor
    // public LocalVarInferenceDemo(var param1){
 
    // }
 
    public static void main(String[] args){
 
        //Not allowed in catch parameter
        // try{
        //     //some operations
        // }catch(var ex){
 
        // }
    }
 
    //Not permitted below
    //public static void someMethod(var param1, var param2){
    //   System.out.println("Some method called");
    //}
 
    //Not permitted in method return type
    // public static var someAnotherMethod2(){
    //     System.out.println("someAnotherMethod called");
    //     var returnObj = 12;
    //     return returnObj;
    // }
}

Образец кода

Этот образец можно найти на GitHub

Опубликовано на Java Code Geeks с разрешения Мохамеда Санауллы, партнера нашей программы JCG . См. Оригинальную статью здесь: Java 10 — JEP 286: Вывод типа локальной переменной

Мнения, высказанные участниками Java Code Geeks, являются их собственными.