با ما همراه باشید

منتشر شده

در

جاوا 10 و Local Variable Type inference
5 (100%) 7

جاوا 10 تاریخ دقیق انتشار این نسخه 20 مارس 2018 است. در حقیقت این نسخه کوتاه مدت بوده و باید خودمان را برای نسخه ی بلند مدت آن یعنی جاوا 11 آماده کنیم. این نسخه بیشتر شامل بهینه سازی هایی است که تاثیری روی کدنویسی ما ندارند. با این وجود قابلیت جالبی در بین تغییرات دیده می شود، به نام Local Variable Type Interface که هم در کدها تغییر ایجاد می کند و هم این مقاله را به  آن اختصاص داده ایم.

اگر با زبان پایتون کد زده باشید این قابلیت شبیه به تعریف متغییر در این زبان است.  به طور خلاصه باید گفت با استفاده از این قابلیت دیگر نیاز به تعیین دقیق نوع متغییر های محلی نداریم.این کامپایلر است که نوع متغییر را با توجه به مقداردهی تشخیص می دهد. تا به الان اگر می خواستیم لیستی از رشته ها بسازیم، کد مشابه پایین را می زدیم :

 List<String> list =  new ArrayList<>() ;

حال اگر بخواهیم از این قابلیت جدید استفاده کنیم کافیست بجای List ( در اینجا نوع متغییر است)  var را جایگزین کنیم. پس کد بالا به صورت زیر تغییر خواهد کرد :

 var list =  new ArrayList<String>() ;
var  چیست ؟

var نه کلمه ی کلیدی جدیدی است و  نه هیچ بایت کد جدیدی برای آن تعریف شده است. براساس مقداری که به متغییر می دهیم تفسیر می شود. با اجرای کد زیر می توانیم نوع var را در خروجی ببینیم :

 public static void main(String[] args) {
       ArrayList<String> list =  new ArrayList<>() ;
       System.out.println( list.getClass().getName());
    }

کاربرد ها :

بجز محدودیت هایی که در ادامه ی متن به آن ها اشاره کرده ایم، استفاده ای مشابه با متغییر عادی دارد. به دو مورد از این کاربردها به عنوان نمونه اشاره می کنیم :

استفاده در  loop ها :

در همه ی انواع loop قابل به کارگیری است. صد البته استفاده از آن در کدهایی مشابه مثال پایین باعث خلاصه تر شدن کد می شود :

public static void main(String[] args) {
        List<ArrayList<String>> list = new ArrayList<>() ;
        for( ArrayList<String> str : list){
            //do something
        }
        for ( var str : list){
            //do something
        }
     }

 

 پاس دادن به تابع :

در پایین نمونه کدی برای این کاربرد می بینید :

public class VarTest {
    public static void main(String[] args) {
       var x = 9 ;
        System.out.println(plusFive(x)) ;
    }
    public static int plusFive( int x) {
        var y = x+5;
        return y;
    }
}

 

محدودیت ها :

محدودیت هایی هنگام استفاده از var  برای تعریف متغییر وجود دارد. در ادامه سعی کردیم تمام موارد را پوشش دهیم.  مثال هایی که در ادامه می بینید، قابلیت اجرا نداشته و همگی با خطا همراه هستند.

امکان تعریف  چندتایی وجود ندارد :
public static void main(String[] args) {
            var x = "it", y ="has" , z ="error" ;
    }

 

به عنوان  نوع ورودی یا خروجی تابع قابل استفاده نیست :
public class MethodTest {

    public var returnTypeTest() {
    }

    public void inputTest( var x){
    }
}

 

به عنوان متغییر کلاس قابل استفاده نیست :
public class FieldTest {

   private var x ;

}

 

به عنوان متغییر بخش catch قابل استفاده نیست :
public static void main(String[] args) {
        try {
            //do something
        } catch (var e) {
        }
    }

 

محدودیت های  زمان تعریف و مقدار دهی  :

تمام موارد زیر مشکل با خطا همراه هستند :
1. در لحظه ی تعریف مقدار دهی نشود.
2. با مقدار null، مقدار دهی شود.
3. با Lambda مقدار دهی شود.
4. با Method Refrence مقدار دهی شود.

public static void main(String[] args) {

        var x  ;  // without initializer
        x = 10 ;

        var y = null ; // null Assignment
        var z = () -> {}; // Lambda initializer
        var t = ClassName :: methodName ; // Method Reference initializer

    }

 

امکان مقدار دهی مجدد با مقداری از نوع دیگر وجود ندارد :

فرض کنید بار اول متغییر را با مقداری از نوع int  مقدار دهی کرده اید. کامپایلر این متغییر رو از نوع int میشناسد و دیگر مقدار String نمی پذیرد :

 public static void main(String[] args) {
       var x = 0 ;
       x= "m" ;
    }

 

نکته ی آخر :

زمان تعریف آرایه اشتباه نکنید.تنها خط 2  روش درستی برای تعریف آرایه است.

public static void main(String[] args) {
        var array = new int[5] ; //correct
        var array[] = new int[5] ; //incorrect
    }

برای بررسی بیشتر جزئیات مراجعه به این لینک  مفید خواهد بود.

نویسنده:محبوبه شیدایی