قابلیت های پیش نمایشی جاوا — به زبان ساده
در این مقاله قصد داریم به بررسی انگیزه ارائه قابلیت های پیش نمایشی جاوا بپردازیم و تفاوت آنها را با قابلیتهای آزمایشی بدانیم. همچنین شیوه فعالسازی «قابلیتهای پیشنمایشی» (Preview Features) را با ابزارهای مختلف مورد بررسی قرار میدهیم.
علت ارائه قابلیت های پیش نمایشی جاوا چیست؟
همچنان که احتمالاً اکنون برای هر کس روشن است، انتشار قابلیتهای جاوا هر شش ماه یک بار صورت میگیرد. اما در پارهای موارد این بازه ششماهه موجب میشود که فرصت کافی برای دریافت بازخورد در مورد قابلیتهای جدید وجود نداشته باشد. با توجه به این که جاوا برای توسعه تعداد بالایی از سیستمها مورد استفاده قرار گرفته است، حتی یک کارکرد نادرست کوچک در یک پیادهسازی یا طراحی ضعیف قابلیت میتواند هزینههای زیادی اعمال کند. باید روشی داشته باشیم که اطمینان حاصل کنیم قابلیتهای جدید پایدار هستند. مهمتر آن که باید با نیازهای جامعه توسعهدهندگان نیز سازگار باشد.
به لطف JEP-12 (+) امکان درج مرور قابلیتهای زبان و VM در نسخههای انتشار فراهم شده است. بدین ترتیب جامعه توسعهدهندگان میتواند قابلیتهای جدید را در سناریوهای واقعی ولی مطمئناً در محیطهای غیر پروداکشن بررسی کند. بر اساس این بازخورد جامعه، یک قابلیت پیشنمایشی میتواند مورد بازنگری و اصلاح قرار گیرد و این اصلاح حتی ممکن است چند بار در چند انتشار رخ دهد. در نهایت قابلیتها به صورت دائمی درمیآیند. اما در برخی موارد مرورهای ارائه شده ممکن است منجر به حذف کلی یک قابلیت پیشنمایشی شوند.
قابلیتهای پیشنمایشی در برابر قابلیت های آزمایشی جاوا
قابلیتهای پیشنمایشی جاوا کاملاً تخصصی هستند و در معرض ارزیابی قرار میگیرند. از این رو هنوز به حالت نهایی خود نرسیدهاند. به دلیل کیفیت بالا، همه پیادهسازیهای متفاوت JDK باید شامل همه قابلیتهای پیشنمایشی هر نسخه عرضه شده جاوا باشند. با این حال یک نسخه جاوا همچنان نمیتواند قابلیتهای پیشنمایشی نسخههای قبلی را داشته باشد. قابلیتهای پیشنمایشی اساساً روشی برای تشویق جامعه به بررسی و ارائه بازخورد هستند. به علاوه همه قابلیتهای جاوا برای این که نهایی شوند، وارد مرحله پیشنمایش نمیشوند.
JEP-12 در مورد قابلیتهای نمایشی چنین توضیح میدهد:
یک قابلیت پیشنمایشی زبان یا VM به قابلیتی جدیدی گفته میشود که طراحی، مختصات و پیادهسازی آن همگی کامل شدهاند، اما قبل از رسیدن به حالت نهایی و دائمی در پلتفرم Java SE از یک مرحله بررسی و ارزیابی گسترده نیز برخوردار میشود و در نهایت ممکن است ویرایش شده یا حذف شود.
از سوی دیگر قابلیتهای آزمایشی هنوز فاصله زیادی با تکمیل شدن دارند. اثرات آنها به طور مشخص جدا از اثرات JDK است. قابلیتهای آزمایشی ناپایدار هستند و از این رو ریسکی را بر زبان تحمیل میکنند. در نتیجه پیادهسازیهای مختلف JDK ممکن است شامل مجموعه قابلیتهای آزمایشی متفاوتی باشند.
استفاده از قابلیتهای پیشنمایشی جاوا
قابلیتهای پیشنمایشی به صورت پیشفرض غیرفعال هستند. برای فعالسازی آنها باید از آرگومان enable-preview استفاده کنید که همه قابلیتهای پیشنمایشی را به صورت یکباره فعال میکند.
کامپایلر جاوا و همچنین JVM باید از نسخه یکسانی از جاوا باشند که شامل قابلیتهای پیشنمایشی است که میخواهیم استفاده کنیم. برای نمونه در کد زیر از یک قابلیت آزمایشی به نام بلوکهای متنی در JDK 13 استفاده شده است و تلاش میکنیم آن را کامپایل کنیم:
1String query = """
2 SELECT 'Hello World'
3 FROM DUAL;
4 """;
5System.out.println(query);
البته باید مطمئن شویم که از JDK 13 روی IDE محبوب خود استفاده میکنیم. برای نمونه میتوانیم نسخه 13 OpenJDK را دانلود کرده و به زمان اجرای جاوا در IDE اضافه کنیم.
طرز کار در Eclipse
در ابتدا ایکلیپس کد را به صورت قرمز علامتگذاری میکند، چون کامپایل نمیشود. پیام خطا نشان میدهد که برای استفاده از بلوکهای متنی باید قابلیتهای پیشنمایشی را فعال کنیم.
باید روی پروژه راست-کلیک کرده و از منوی بازشدنی گزینه Properties را انتخاب کنیم. سپس به Java Compiler میرویم. اکنون میتوانیم قابلیتهای پیشنمایشی را یا برای یک پروژه خاص و یا برای کل فضای کاری فعال کنیم. سپس باید تیک گزینه Use default compliance settings را برداریم. تنها گزینهای که میتوانیم تیک آن را نگه داریم Enable preview features for Java 13 است:
طرز کار در IntelliJ IDEA
چنان که انتظار میرود کد به صورت پیشفرض در IntelliJ IDEA حتی با جاوا 13 نیز کامپایل نمیشود و با پیام خطایی مشابه پیام خطایی که در ایکلیپس دیدیم مواجه میشویم. برای فعالسازی قابلیتهای پیشنمایشی باید در منوی فایل به گزینه Project Structure برویم. در پروژه باید گزینه 13 (Preview) را به عنوان سطح زبان پروژه انتخاب کنیم:
بدین ترتیب این قابلیتها فعال میشوند. اما اگر خطا همچنان موجود باشد، باید به صورت دستی آرگومانهای کامپایلر را اضافه کنیم تا قابلیتهای پیشنمایشی فعال شوند. با فرض این که از پروژه Maven استفاده میکنید، افزونه کامپایلر در pom.xml باید شامل کد زیر باشد:
1<build>
2 <plugins>
3 <plugin>
4 <groupId>org.apache.maven.plugins</groupId>
5 <artifactId>maven-compiler-plugin</artifactId>
6 <configuration>
7 <source>13</source>
8 <target>13</target>
9 <compilerArgs>
10 --enable-preview
11 </compilerArgs>
12 </configuration>
13 </plugin>
14 </plugins>
15</build>
در صورت نیاز میتوانید قابلیتهای پیشنمایشی را برای پلاگینهای Maven نیز درون پیکربندیهای مربوطه به روشی مشابه فعال کنید.
طرز کار در خط فرمان
در زمان کامپایل دستورهای javac باید دو آرگومان enable-preview و release را داشته باشند:
javac --release 13 --enable-preview ClassUsingTextBlocks.java
به خاطر داشته باشید که نسخه JDK شماره N از قابلیتهای پیشنمایشی نسخه N-1 یا هر نسخه قبلتر پشتیبانی نمیکند. از این رو در صورت تلاش برای اجرای دستور قبلی با JDK 14 با خطا مواجه خواهیم شد. به طور خلاصه آرگومان انتشار باید روی N برای نسخه انتشار JDK کامپایلر و JVM مورد استفاده تنظیم شود تا قابلیتهای پیشنمایشی فعال شوند.
آرگومان انتشار صرفاً یک حفاظت اضافی ارائه میکند تا مطمئن شویم کدی که از قابلیتهای پیشنمایشی استفاده میکند، احیاناً در پروداکشن مورد استفاده قرار نمیگیرد. در زمان اجرا دستور java تنها آرگومان enable-preview را الزام میکند:
java --enable-preview ClassUsingTextBlocks
با این حال تنها کدی که از قابلیتهای پیشنمایشی نسخه خاص JDK استفاده میکند اجرا خواهد شد.
سخن پایانی
در این مقاله قابلیتهای پیشنمایشی را در جاوا معرفی کردیم. دلیل استفاده از آنها را توضیح دادیم و با تفاوتهای آن با قابلیتهای آزمایشی آشنا شدیم. همچنین با استفاده از قابلیت پیشنمایشی بلوکهای متنی در JDK 13 به صورت گام به گام آشنا شده و شیوه استفاده از قابلیتهای پیشنمایشی را در ایکلیپس، IntelliJ ،Maven و خط فرمان مورد بررسی قرار دادیم.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای جاوا (Java)
- مجموعه آموزشهای برنامهنویسی
- گنجینه آموزشهای جاوا (Java)
- زبان برنامهنویسی جاوا (Java) — از صفر تا صد
- ۱۰ مفهوم اصلی زبان جاوا که هر فرد مبتدی باید بداند
==