دانستنی‌ها

نسخه۱۴ جاوا: چه قابلیت‌های جدیدی اضافه شده‌است

جاوا ۱۴ اکنون در دسترس است!

نسخه‌ٔ ۱۴ جاوا طبق سیاست عرضه نسخه جدید در هر6 ماه، در تاریخ ۱۷ مارچ ۲۰۲۰ منتشر شد. در این نسخه، تعداد زیادی بهبود و پیش‌رفت صورت گرفته، چیزی بیش‌تر از مجموع جاوا ۱۲ و ۱۳.

برخی تغییرات جاوا ۱۴ عبارت است از:

  1. تطبیق الگو برای instanceof (پیش‌نمایش)

  2. نمایش موثرتر استثنای NullPointer

  3. سوییچ‌‌کیس به عنوانِ عبارت

  4. ابزار پکیج‌بندی jpackage (در حال توسعه)
  5. recordها (پیش‌نمایش)

  6. لیترالِ رشته‌ٔ چندخطی (پیش‌نمایش دوم)

تطبیق الگو برای instanceof

عبارت instanceof برای بررسی این استفاده می‌شود که آیا شی‌ای (Objectای) که در حافظه رفرنس به آن را داریم،‌ از کلاس مورد نظر هست یا نه. اضافه شدن تطبیق الگو (pattern matching) به جاوا این امکان را می‌دهد که عبارات بررسی instanceof موجزتر و خواناتر نوشته بشوند. در واقع، امکان جدیدِ اضافه‌شده، این است که در همان عبارت instanceof، عمل cast هم به صورت ضمنی انجام شود و کد‌های تکراری (مشابه آن‌چه در توابع equals می‌بینیم) ساده‌تر و خوانا‌تر شوند.

کد قبل از جاوا ۱۴

if (obj instanceof String) {
    String str = (String) obj; // need to declare and cast again the object
    .. str.contains(..) ..
}else{
     str = ....
}

کد جدید با بهبود‌های جاوا ۱۴

if (!(obj instanceof String str)) {
    .. str.contains(..) .. // no need to declare str object again with casting
} else {
    .. str....
}

مثال دیگر:

if (obj instanceof String str && str.length() > 5) {.. str.contains(..) ..}

if (obj instanceof String str || str.length() > 5) {.. str.contains(..) ..}

 

نمایش موثرتر استثناهای NullPointer

همه برنامه‌نویس‌های جاوا NullPointerException را تجربه کرده‌اند. خطایی که برای برنامه‌نویسان تازه‌کار زیاد اتفاق می‌افتد ولی هیچ برنامه‌نویسی از آن مصون نیست! زبان‌های مختلف راه‌کارهای متفاوتی برای جلوگیری از این خطا ارائه کرده‌اند. مثلا nullable‌ها در کاتلین یا optional در جاوا نمونه‌‌هایی از تلاش برای خلاصی از این خطا هستند. حالا اوراکل با بهبود در خطاهای داده‌شده توسط JVM، کار برنامه‌نویسان را برای پیدا کردن علت این استثنا راحت کرده‌ است.

در نسخه‌های پیشین جاوا، خطای NPE فقط آن خط کدی که باعث نال‌پوینتر بود را مشخص می‌کرد مثلا در کد

 a.i = 99;

خطایی مشابه زیر تولید می‌شد:

Exception in thread "main" java.lang.NullPointerException
                            at Prog.main(Prog.java:5)

اما این خطا اطلاعات کافی را به ما نمی‌دهد. برای مثال فرض کنید کد ما چیزی مشابه این باشد:

 a.b.c.i = 99;

در این حالت مشخص نیست که a یا b یا c کدام null بوده‌اند. در جاوا ۱۴ خطای بهبودیافته چیزی مشابه این است:

Exception in thread "main" java.lang.NullPointerException:
        Cannot read field 'c' because 'a.b' is null.
    at Prog.main(Prog.java:5)

البته این‌جا این ریسک هم وجود دارد که اسم متغیر null شده، ممکن است شامل اطلاعات ارزشمندی از منبع‌کد باشد و نشر این اطلاعات ممکن است باعث مخاطرات امنیتی شود.

در صورتی که مایلید این خطاها را فعال کنید باید ماشین مجازی جاوا را با آرگومان -XX:+ShowCodeDetailsInExceptionMessages فراخوانی کنید. هم‌چنین اطلاعات بیش‌تری در این لینک موجود است.

سوییچ‌‌کیس به عنوانِ عبارت

در جاوا ۱۴، بیانیه‌های switch case گسترش یافته‌اند. اکنون با استفاده از فلش (<-) می‌توانند به عنوان عبارت استفاده شوند و مقدار را return/yield کنند. این امکان در جاوا ۱۲ و ۱۳ به صورت پیش‌نمایش وجود داشت.

مثال ۱

قبل از جاوا ۱۴

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}

با امکانات جاوا ۱۴

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
 
مثال ۲

قبل از جاوا ۱۴

int numLetters;
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        numLetters = 6;
        break;
    case TUESDAY:
        numLetters = 7;
        break;
    case THURSDAY:
    case SATURDAY:
        numLetters = 8;
        break;
    case WEDNESDAY:
        numLetters = 9;
        break;
    default:
        throw new IllegalStateException("Wat: " + day);
}

بعد از جاوا ۱۴

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};
مثال‌های بیش‌تر
//Arrow labels
static void grade(int g) {
    System.out.println(
        switch (g) {
            case  1 -> "A";
            case  2 -> "B";
            default -> "C";
        }
    );
}
------------------------------------------
//Yielding a value - introduce a new yield
int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        int d = day.toString().length();
        int result = f(d);
        yield result;
    }
};

ابزار پکیج‌بندی jpackage

گاهی اوقات ساخت یک فایل jar برای پکیج‌کردن برنامه‌ توسعه‌داده شده به زبان جاوا کافی نیست، مثلا ممکن است برنامه ما به چندین پکیج دیگر نیاز داشته باشد‌ (dependencies). برای این منظور ناچاریم کیت نصب مناسب سیستم مقصد تدارک ببینیم.

ابزار جدید jpackage، برنامه‌جاوایی شما را داخل یک پکیج ویژه‌ٔ پلتفرم به همراه تمام پیش‌نیازها قرار می‌دهد. فرمت‌های وابسته به سخت‌افزاری که پیشتیبانی‌ می‌شوند این‌ها هستند:

  1. گنو/لینوکس: deb و rpm
  2. سیستم‌عامل مک:  pkg و dmg
  3. ویندوز: msi و exe

recordها

رکوردها، برای خلاصه‌سازی سینتکس تعریف کلاس‌ آمده‌اند (و البته هنوز در مراحل پیش‌نمایش هستند).

گاهی برای تعریف کلاس‌های ساده نیاز به نوشتن‌ کد‌های تکراری برای constructorها و متد‌های getter و setter و equals و hashCode و toString و غیره بود. برای جلوگیری از نوشتن این کد‌های تکراری، جاوا recordها را به ما معرفی می‌کند.

مثال

قبل از جاوا ۱۴

final class Point {
    public final int x;
    public final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    // state-based implementations of equals, hashCode, toString
    // nothing else

با رکورد‌های جاوا ۱۴

record Point(int x, int y) { }

در استفاده از رکوردها چندین محدودیت وجود دارد:

  • نمی‌تونند از کلاس دیگری ارث‌بری کنند
  • فقط می‌توانند ویژگی‌های private و final داشته باشند.
  • به صورت ضمنی final هستند.
  • نمی‌توانند انتزائی (abstract) باشند.

مثال استفاده از recordها

record Point(int x, int y) { }

public class Test{
	public static void main(String[] args){
		Point p = new Point(1,2);
		System.out.println(p.x());
		System.out.println(p.y());	
	}
	
}

همان‌طور که می‌بینید x و y عملا private هستند و دسترسی به آن‌ها با تابع getter انجام شده‌است.

برای کامپایل این برنامه هم باید از سوییچ enable-preview  --release 14-- استفاده کنید. البته بازهم خطایی مبنی بر preview بودن این قابلیت، نمایش می‌دهد.

برای اجرا نیز باید از سوییچ enable-preview--  برای ماشین مجازی جاوا استفاده کنید.

لیترالِ رشته‌ٔ چندخطی

نوشتن قطعه‌کد html یا XML یا JSON یا SQL در کد جاوا گاهی دشوار می‌شود. برای رفع این مشکل، جاوا قابلیت text block را معرفی کرده است.

یک text block، یک لیترال رشته‌ چندخطی است مشابه آنچه در پایتون به عنوان multi-line string وجود دارد.

مثال کد html بدون text block:

String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, world</p>\n" +
              "    </body>\n" +
              "</html>\n";

 سه کارکتر دابل‌کوتیشن پشت سر هم، مشخص‌کننده شروع و پایان text block است.

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;

 

این مطلب ترجمه مطلبی از سایت techgeeknext با تلخیص و تصرف است. برخی JEP ها حذف شدند که می‌توانید در مطلب اصلی آن‌ها را ملاحظه کنید. (برداشت از مطلب مذکور در فروردین ۹۸ انجام شد.)

.

.

.

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

آدرس کانال تلگرام: JavaCupIR@

آدرس اکانت توییتر: JavaCupIR@

آدرس صفحه اینستاگرام: javacup.ir

آدرس گروه لینکدین: Iranian Java Developers

 

نوشته های مشابه

یک دیدگاه

  1. سلام.
    اگه مثل جلسه 20 که مربوط به جاوا 8 ههه یک جلسه برای ویژگی ها و قابلیتهای جدید از 8 تا 14 تهیه کنید عالی میشه.
    با تشکر از وبسایت خوبتان

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا