رکوردهای جاوا و چرا باید از آنها استفاده کنید
اگر در یادگیری جاوا مبتدی هستید، در مورد اصول اولیه مانند کلاس ها، متدها، enums و غیره شنیده اید. اما از آنجایی که رکوردهای جاوا 16 به طور دائم به مجموعه ویژگی های جاوا اضافه می شوند. این آموزش کوتاه به شما توضیح می دهد که رکوردهای جاوا چیست و نکاتی درباره نحوه استفاده از آنها در پروژه بعدی خود ارائه می دهد.
تمام اطلاعات این آموزش از مستندات رکوردهای جاوا 16 و تجربه شخصی من است.
سوابق چیست؟
رکوردهایی که به راحتی توضیح داده می شوند، انتزاعی از دانه های جاوا هستند. یک رکورد به طور خودکار یک سازنده همه آرگومان ها را تعریف می کند و به همه ویژگی های رکورد دسترسی عمومی می دهد. رکورد هیچ روش دیگری ندارد. این فقط یک است احمق شی جاوا بدون هیچ عملکردی.
نحوه پیاده سازی رکورد
مشابه enums یک رکورد می تواند به تنهایی بخشی از یک کلاس جاوا یا یک فایل باشد.
به عنوان مثال می خواهیم یک کسری را تعریف کنیم. کسری از یک صورت و یک مخرج تشکیل شده است. اگر بخواهیم آن را به عنوان یک کلاس کلاسیک جاوا بنویسیم به شکل زیر است:
public class Fraction {
private double numerator;
private double denominator;
public Fraction() {
this.numerator = 0.0;
this.denominator = 1.0;
}
public Fraction(double numerator, double denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
public void setNumerator(double numerator) {
this.numerator = numerator;
}
public double getNumerator() {
return this.numerator;
}
public void setDenominator(double denominator) {
this.denominator= denominator;
}
public double getDenominator() {
return this.denominator;
}
}
همانطور که می بینید این کدهای زیادی فقط برای تعریف کلاس با دو ویژگی است. و حالا بیایید ببینیم که این به عنوان یک رکورد چگونه به نظر می رسد:
public record Fraction(double numerator, double denominator) {}
کوتاه درسته؟ و این مهمترین دلیل استفاده از رکوردهاست. این خط منفرد یک سازنده همه آرگومان ها و دو صفت عمومی شمارنده و مخرج را جمع می کند.
اگر میخواهید یک نمونه جدید از این رکورد ایجاد کنید، این کار را مانند کلاسهای معمولی انجام میدهید.
Fraction fractionAsRecord = new Fraction(0.0, 1.0);
نادیده گرفتن سازنده و گیرنده/ تنظیم کننده
اگر متدهای سازنده پیشفرض و گیرنده/تنظیمکننده با حالت استفاده شما مطابقت ندارند، میتوانید آنها را لغو کنید. برای یک سازنده شما این کار را به صورت زیر انجام خواهید داد:
public record Fraction(double numerator, double denominator) {
public Fraction(double numerator, double denominator) {
if (numerator == 0 && denominator == 0) {
throw new java.lang.IllegalArgumentException(
"Invalid fraction: " + numerator + "https://dev.to/" + denominator
);
}
this.numerator = numerator;
this.denominator = denominator;
}
}
اینکه چگونه می توانید آن را ببینید، طبق معمول نیازی به حاشیه نویسی لغو ندارد. همین کار را می توان با روش ها انجام داد double numerator()
یا void numerator(double numerator)
.
ویژگی ها و روش های ایستا
اکنون به عملکرد پیشرفته رکوردها رسیدیم. سوابق به شما این امکان را می دهد که ویژگی های استاتیک و روش های استاتیک را تعریف کنید.
برای مثال ما می خواهیم کسر خود را با عدد دو تقسیم کنیم. بنابراین ما می توانیم یک ویژگی ثابت را اعلام کنیم static double half = 2.0
و روش ایستا static Fraction divideByTwo(Fraction fr)
.
public record Fraction(double numerator, double denominator) {
static double half = 2;
public static Fraction divideByTwo(Fraction fr) {
return new Fraction(fr.numerator(), fr.denominator() * half);
}
}
روش فوق را می توان توسط Fraction.divideByTwo(fraction)
. همانطور که می بینید می توانید رکوردها را با روش های مورد نیاز خود تا زمانی که ثابت هستند گسترش دهید. این به شما کمی انعطاف بیشتر در استفاده از رکوردها می دهد.
سایر ویژگی های مفید
در مستندات جاوا 16 تعدادی ویژگی پیشرفته وجود دارد که من به آنها اشاره خواهم کرد اما با تمام جزئیات توضیح نمی دهم. می توانید آنها را در پیوند بالا در بخش “ویژگی های کلاس های رکورد” پیدا کنید.
شخصاً این جنبه که به یک رکورد اجازه میدهم برخی از رابطها را پیادهسازی کند برای من مفیدترین است. برای مثال می توانید چند روش اساسی برای گروهی از رکوردها تعریف کنید. من برای شما یک مثال ساده با رابط ارائه می کنم Mathobject
:
public interface Mathobject {
public Mathobject divideByTwo();
}
اگر اجازه دهیم کسری ما این رابط را پیاده سازی کند، می توانیم روش استاتیک خود را بازنویسی کنیم divideByTwo
. به نظر می رسد این است:
public record Fraction(double numerator, double denominator) implements Mathobject {
static double half = 2;
@Override
public Fraction multiplyByTwo() {
return new Fraction(numerator, denominator * half);
}
}
رکورد روش رابط را لغو می کند Mathobject
و اجازه دهید از دو ویژگی از کسری مستقیماً در داخل متد استفاده کنیم زیرا این یک روش غیر ایستا است.
نتیجه
چه چیزی باعث می شود رکوردها در پایان بسیار مفید باشند؟
آنها کد بویلر به میزان قابل توجهی کمتری تولید می کنند.
هر توسعهدهنده جاوا با تجربه رکوردها را میداند و میتواند کد کوتاه را به راحتی درک کند. بنابراین کد شما را قابل درک تر و تمیزتر می کند.
و جنبه بسیار مهم همه اینها، کد بسیار کمتری برای نوشتن است که باعث صرفه جویی در وقت شما می شود.
به کدنویسی ادامه دهید.