Faragiri

همهٔ زبان‌ها

آموزش پایه‌های جاوا جاوا

جاوایی که در ذهن بیشتر آدم‌هاست نسخه‌ای است که پیش از سال ۲۰۱۴ متوقف شده. رکورد، var و بلوک متنی سه چیزی هستند که کد را نصف می‌کنند.

۴بخش
۳دقیقه خواندن
۴عمق

همان کار، دو نسخه از یک زبان

جاوایی که یاد گرفته می‌شود و جاوایی که نوشته می‌شود

هر دو ستون کامپایل می‌شوند و یک کار می‌کنند؛ ستون دوم فقط چیزهایی را حذف کرده که کامپایلر خودش می‌داند.

نسخه‌ای که در دانشگاه دیدیدکلاس داده دوازده سطری و نام‌های getدار
نسخه‌ای که امروز نوشته می‌شودرکورد، استنتاج محلی، و بلوک متنی
یک کلاس دادهفیلد، سازنده، getter، equals، hashCode، toStringrecord Qet(String kod, int mojoodi) {}
خواندن یک فیلدgetKod()kod()
متغیر محلینوشتن نوع در هر دو سمتvar، فقط برای محلی
رشته چندسطریچسباندن با نویسه سطر جدیدبلوک متنی با سه گیومه
اجرای یک فایلاول کامپایل، بعد اجرایک دستور، بدون مرحله جدا

ستون دوم علامت خورده چون روی این پنج ردیف یک جواب درست هست. این درباره هر تغییری در تاریخ این زبان صادق نیست و بعضی افزوده‌ها هنوز محل بحث‌اند.

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

  • record Qet(String kod, int mojoodi) {}

همین یک سطر سازنده، متدهای دسترسی، مقایسه، درهم‌سازی و چاپ خوانا را می‌سازد. یک تفاوت نامگذاری هست که تازه‌کارها را غافلگیر می‌کند: متد دسترسی kod() است و نه getKod(). رکوردها از Java 16 در زبان‌اند و برای داده‌ای که پس از ساخت عوض نمی‌شود ساخته شده‌اند.

دو چیز دیگر که کد را کوتاه می‌کنند: var که نوع یک متغیر محلی را استنتاج می‌کند و فقط برای محلی‌هاست، نه برای فیلد و نه برای پارامتر. و بلوک متنی، یعنی رشته چندسطری با سه گیومه، که جای چسباندن رشته با نویسه سطر جدید را می‌گیرد و برای نوشتن یک کوئری یا یک قالب JSON در کد تفاوت زیادی می‌سازد.

var استنتاج است، نه نوع پویا

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

جایی که نباید نوشته شود، جایی است که سمت راست نوع را نمی‌گوید. var x = getRadif(); خواننده را مجبور می‌کند برود امضای آن متد را ببیند، و همان هزینه‌ای است که ارزان‌ترین مستندی که وجود دارد درباره‌اش است.

چهار سطر که یک برنامه کامل‌اند

از Java 21 به بعد، برنامه‌ای که فقط چیزی چاپ می‌کند دیگر به کلاس و متد اصلی با امضای کامل نیاز ندارد و می‌شود یک فایل با یک متد نوشت و مستقیم اجرا کرد. همین‌طور از Java 11 به بعد، اجرای یک فایل تک‌فایلی با خود دستور جاوا انجام می‌شود و مرحله کامپایل جدا لازم نیست. این دو با هم، همان دیوار اول را که خیلی‌ها را از این زبان می‌راند برداشته‌اند.

جایی که کار گیر می‌کند، نسخه‌ای است که یاد گرفته می‌شود

بیشتر منابع فارسی جاوا برای دانشگاه نوشته شده‌اند و روی نسخه‌ای مانده‌اند که در آن نه رکورد هست، نه var، نه بلوک متنی. کسی که از آن‌ها یاد می‌گیرد زبان را بلد می‌شود ولی نسخه‌ای را که ده سال قدیمی است، و اولین کدی که در یک تیم واقعی می‌بیند برایش ناآشناست. راه عملی کوتاه است: پیش از هر چیز نسخه‌ای را که نصب کرده‌اید بررسی کنید و اگر آموزشی getKod() و کلاس‌های داده دوازده سطری نشان می‌دهد، آن آموزش قدیمی است حتی اگر تاریخ انتشارش تازه باشد.

ابزار، و سالی که این حرف درست است

در سال ۲۰۲۶ نسخه‌ای که یک پروژه تازه باید رویش باشد Java 25 است، که آخرین نسخه با پشتیبانی بلندمدت است و جانشین Java 21 شد. توزیع رایگان و متن‌بازش از چند سازنده در دسترس است و برای همین «رایگان بودن جاوا» دیگر یک بحث نیست. ابزار ساخت پیش‌فرض برای پروژه تازه Gradle است و Maven همچنان در بیشتر پروژه‌های موجود اجرا می‌شود؛ هر دو متن‌باز و رایگان‌اند و هر دو وابستگی‌ها را از مخزن مرکزی می‌گیرند، که از ایران به یک آینه نیاز دارد.

پرسش بعدی این است که وقتی داده از یک سطر بیشتر شد، چه شکلی برای تعریف نوع درست است، که کلاس، پکیج، و کتابخانه استاندارد جوابش را دارد. و ظرفی که این رکوردها در آن نگه داشته می‌شوند در لیست، مپ و ست، و انتخاب میان آن‌ها است.

کنار این

بالای این