Java record
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
-
Boilerplate Code کدهای تکراری و کلیشهای (مانند
Getters،Constructors،equalsوhashCode) که برای ایجاد یک کلاس ساده حامل داده باید نوشته شوند و باعث شلوغی پروژه میگردند. -
Immutable اشیاء تغییرناپذیر؛ به این معنا که پس از مقداردهی اولیه در
Constructor، دیگر نمیتوان مقادیر آنها را تغییر داد. درRecordها، تمام فیلدها به صورت پیشفرضfinalهستند. -
Java Record یک ویژگی که از جاوا ۱۴ اضافه شد و به برنامهنویس اجازه میدهد کلاسهای حامل داده (Data Carrier) را با کمترین میزان کدنویسی تعریف کند.
-
Data Transfer Object (DTO) کلاسهایی که صرفاً برای جابهجایی دادهها بین لایههای مختلف برنامه (مثلاً از لایه دیتابیس به لایه نمایش) استفاده میشوند و منطق تجاری پیچیدهای ندارند.
موارد مصاحبه ای
-
هدف اصلی از معرفی Record در جاوا چیست؟ هدف اصلی، کاهش کدهای تکراری (
Boilerplate) و ایجاد کلاسهایی است که هدفشان فقط نگهداری و جابهجایی دادههای تغییرناپذیر (Immutable) است. -
تفاوت نامگذاری متدهای Getter در Record با کلاسهای معمولی چیست؟ در کلاسهای معمولی، متدها با پیشوند
getشروع میشوند (مثلgetAge)، اما درRecordها، نام متد دقیقاً همان نام فیلد است (مثلage()). -
آیا در یک Record میتوان مقدار فیلدها را پس از ساخته شدن تغییر داد؟ خیر، فیلدهای یک
Recordبه صورتprivate finalتعریف میشوند و هیچ متدSetterبرای آنها تولید نمیشود، بنابراین کاملاً تغییرناپذیر هستند. -
چه متدهایی به صورت خودکار توسط کامپایلر برای یک Record تولید میشوند؟ کامپایلر به صورت خودکار متدهای
equals()،hashCode()،toString()، یکPublic Constructorو متدهای دسترسی به فیلدها (Getters) را ایجاد میکند. -
آیا امکان تعریف متدها یا متغیرهای Static در Record وجود دارد؟ بله، مشابه کلاسهای معمولی، میتوان در
Recordها نیز متغیرها و متدهایstaticتعریف کرد.
سناریو کاربردی
فرض کنید یک موجودیت (Entity) در دیتابیس به نام Person دارید که فیلدهای زیادی دارد. اما برای ارسال داده به سمت کلاینت (مثلاً فرانتاند)، فقط به سه فیلد firstName ،lastName و age نیاز دارید.
در حالت سنتی، باید یک کلاس SimplePerson میساختید که حدود ۵۰ خط کد (شامل فیلدها، سازنده، گترها و...) داشت. اما با استفاده از Record میتوانید این کار را در یک خط انجام دهید:
public record SimplePerson(String firstName, String lastName, int age) { }
این کار باعث میشود هدف کد شفافتر شود و هر کسی با دیدن این خط متوجه شود که این ساختار صرفاً برای جابهجایی این سه فیلد دادهای است.
بیشتر بدانید
-
ساختار تعریف Record برای تعریف، به جای کلمه کلیدی
classازrecordاستفاده میشود و فیلدها در پرانتز مقابل نام آن تعریف میشوند. -
دسترسی به فیلدها برای دسترسی به دادهها در یک شیء رکورد به نام
person، به جای استفاده ازperson.getFirstName()باید ازperson.firstName()استفاده کنید. -
کاهش خطای انسانی استفاده از
Recordباعث میشود اشتباهاتی که ممکن است هنگام نوشتن دستی متدهایequalsیاhashCodeرخ دهد (مثلاً فراموش کردن یک فیلد جدید)، به کلی حذف شوند زیرا کامایلر مدیریت آنها را بر عهده دارد.
