آموزش مفهوم Final در جاوا + مثال عملی
کلمه کلیدی Final به معنی «نهایی» در زمینههای مختلف در برنامهنویسی استفاده میشود. Final به عنوان یک اصلاحکننده بدون دسترسی عمل میکند که میتواند منحصراً برای متغیرها، متدها یا کلاسها اعمال شود. در این مطلب از مجله مکتوب میخواهیم به بررسی Final در جاوا بپردازیم و رسالت آن را در زبان شی گرای جاوا برای کاربران روشن سازیم. پس با ما همراه باشید.
Final در جاوا چیست و چه کاربردی دارد؟
در جاوا، کلمه کلیدی Final به عنوان نوعی اصلاحکننده حیاتی با ویژگیهای خاص عمل میکند که تضمین خواهد کرد متغیرها، متدها یا کلاسها نمیتوانند تغییر یا توسعه یابند. در اینجا ویژگیهای کلیدی کلیدواژه Final در جاوا آمده است:
- متغیرهای نهایی: زمانی که متغیری به عنوان نهایی اعلام میشود، مقدار آن پس از مقداردهی اولیه تغییرناپذیر خواهد شد. هنگامیکه یک مقدار اختصاص داده میشود، نمیتوان آن را تغییر داد و آن را برای تعریف ثابتها یا محافظت از دادههای حساس در برابر تغییرات تصادفی مناسب میکند.
- متدهای نهایی: اعلام متد بهعنوان نهایی به این معنی است که نمیتوان آن را توسط زیر کلاسها لغو کرد. این ویژگی بهویژه برای محافظت از عملکردهای حیاتی در یک کلاس مفید است و اطمینان حاصل میکند که رفتار روش در تمام زیر کلاسها ثابت میماند.
- کلاسهای نهایی: وقتی کلاسی به عنوان نهایی علامتگذاری میشود، غیرقابل ارث میشود، به این معنی که هیچ کلاس دیگری نمیتواند آن را گسترش دهد. این ویژگی برای محافظت از یکپارچگی اجرای کلاس و جلوگیری از تغییرات ناخواسته از کلاسهای فرعی ارزشمند است.
- مقداردهی اولیه: متغیرهای Final باید در زمان اعلان یا در سازنده کلاس مقداردهی اولیه شوند. این تضمین میکند که به متغیر مقدار مشخصی داده میشود و نمیتوان آن را بدون مقدار اولیه رها کرد.
- بهینهسازی عملکرد: استفاده از Final در متغیرها، متدها یا کلاسها گاهی میتواند منجر به بهینهسازی عملکرد شود. کامپایلر میتواند مفروضات خاصی را بر اساس تغییرناپذیری یا عدم توسعهپذیری ایجاد کند و بهینهسازی کد بهتر را ممکن میسازد.
- ارتقای امنیت: با استفاده از کلمه کلیدی Final در جاوا، امنیت را میتوان بهبود بخشید، زیرا از تغییرات غیرمجاز در دادهها یا رفتارهای حیاتی جلوگیری میکند. این امر بهویژه هنگام برخورد با عملیات حساس یا محیطهای امن مفید است.
در کل کلمه کلیدی Final ابزاری ارزشمند در جاوا است که به توسعهدهندگان قدرت میدهد تا تغییرناپذیری را اعمال کنند، از لغو متدها جلوگیری کرده و وراثت کلاس را محدود کنند. با استفاده از این ویژگیها، برنامه نویسان میتوانند قابلیت اطمینان، عملکرد و امنیت کد را افزایش دهند و در عین حال برنامههای کاربردی قوی و قابل نگهداری ایجاد کنند.
نکته: سعی کنید که مثالهای داده شده را در محیطهایی مانند Netbeans Ide ایجاد و اجرا کنید تا به درک بهتری از کلمه کلیدی Final در جاوا برسید.
پیشنهاد مطالعه: آموزش Arraylist در جاوا به زبان ساده
متغیرهای نهایی
زمانی که متغیری با استفاده از کلمه کلیدی Final در جاوا اعلان میشود، مقدار آن ثابت میماند و نمیتوان آن را تغییر داد. این رفتار به طور مؤثر باعث میشود که متغیر به عنوان یک ثابت عمل کند. توجه به این نکته مهم است که یک متغیر Final باید در حین اعلان یا در سازنده مقداردهی اولیه شود. اگر متغیر نهایی یک نوع مرجع باشد، نمیتوان آن را برای اشاره به یک شی دیگر برگشت داد، اما وضعیت داخلی شی ارجاع شده را میتوان تغییر داد. به عنوان مثال، در مورد یک آرایه یا مجموعه نهایی، عناصر را میتوان اضافه یا حذف کرد.
در جاوا، نشان دادن متغیرهای Final با استفاده از حروف بزرگ و جدا کردن کلمات با آندرلاین، با پیروی از قرارداد نامگذاری ثابتها، عمل خوبی در نظر گرفته میشود. این خوانایی و وضوح کد را افزایش میدهد.
در کل وقتی متغیری در جاوا به عنوان Final اعلام میشود، مقدار آن غیرقابل تغییر و شبیه یک ثابت خواهد شد. متغیر باید مقداردهی اولیه شود و اگر یک مرجع باشد، نمیتوان آن را برای اشاره به یک شی دیگر تخصیص داد، اما وضعیت داخلی شی همچنان قابل تغییر است.
final int THRESHOLD = 5;
// Final variable
final int THRESHOLD;
// Blank final variable
static final double PI = 3.141592653589793;
// Final static variable PI
static final double PI;
// Blank final static variable
مقدار دهی اولیه یک متغیر نهایی
برای اطمینان از اینکه متغیر نهایی به درستی در جاوا مقداردهی اولیه شده است، باید در حین اعلان مقداری به آن اختصاص داده شود، چه به طور مستقیم یا از طریق یک دستور انتساب. شکست در مقداردهی اولیه یک متغیر نهایی منجر به خطای زمان کامپایل میشود. سه روش برای مقداردهی اولیه متغیر نهایی وجود دارد:
- مقداردهی اولیه در حین اعلام: این رایجترین رویکرد است. شما میتوانید در زمان خود اعلان یک مقدار به یک متغیر نهایی اختصاص دهید. این هم برای متغیرهای نهایی معمولی و هم برای متغیرهای نهایی خالی قابل استفاده است.
- مقداردهی اولیه در یک بلوک یا سازنده instance-initialzer: در مورد یک متغیر Final خالی که اعلان میشود اما در طی اعلان مقداردهی اولیه نمیشود، میتوان به آن مقداری در داخل یک بلوک initialzer instance اختصاص داد (یک بلوک کد در یک کلاس) یا درون سازنده اگر یک کلاس چندین سازنده داشته باشد، متغیر نهایی خالی باید در هر یک از آنها مقداردهی اولیه شود تا از خطای زمان کامپایل جلوگیری شود.
- مقداردهی اولیه در داخل بلوک استاتیک (برای متغیرهای استاتیک نهایی خالی): اگر یک متغیر Final در جاوا هم ثابت و هم خالی باشد (یعنی در هنگام اعلان مقداردهی اولیه نشده باشد)، میتوان به آن مقداری در داخل یک بلوک استاتیک اختصاص داد. بلوک استاتیک یک بلوک از کد است که یک بار هنگام بارگذاری کلاس اجرا میشود.
با استفاده از این روشها میتوان یک متغیر Final را به درستی مقداردهی اولیه کرد. مهم است که اطمینان حاصل شود که همه سازندهها و بلوکهای استاتیک (در صورت وجود) هر متغیر Final خالی را مقداردهی اولیه میکنند تا از خطاهای کامپایل جلوگیری شده و اطمینان حاصل شود که متغیر دارای مقدار معتبری خواهد بود. مثال زیر برای درک این مفهوم مهم است.
// Java Program to demonstrate Different
// Ways of Initializing a final Variable
// Main class
class GFG {
// a final variable
// direct initialize
final int THRESHOLD = 5;
// a blank final variable
final int CAPACITY;
// another blank final variable
final int MINIMUM;
// a final static variable PI
// direct initialize
static final double PI = 3.141592653589793;
// a blank final static variable
static final double EULERCONSTANT;
// instance initializer block for
// initializing CAPACITY
{
CAPACITY = 25;
}
// static initializer block for
// initializing EULERCONSTANT
static{
EULERCONSTANT = 2.3;
}
// constructor for initializing MINIMUM
// Note that if there are more than one
// constructor, you must initialize MINIMUM
// in them also
public GFG()
{
MINIMUM = -1;
}
}
چه زمانی از متغیر Final در جاوا استفاده کنیم؟
تمایز اولیه بین یک متغیر نرمال و یک متغیر Final فر جاوا این است که یک متغیر نرمال میتواند چندین بار مقدار خود را تخصیص دهد، در حالی که مقدار متغیر Final پس از تخصیص ثابت میماند؛ بنابراین، متغیرهای نهایی باید برای مقادیری استفاده شود که در نظر گرفته شده است در طول اجرای برنامه ثابت بمانند. با استفاده از کلمه کلیدی Final، میتوانیم اطمینان حاصل کنیم که مقدار یک متغیر بدون تغییر باقی میماند و ماهیت ثابت آن را نشان میدهد.
پیشنهاد مطالعه: آشنایی با مفهوم HashMap در جاوا
مرجع متغیر Final چیست؟
هنگامیکه متغیر Final به عنوان مرجع یک شی عمل میکند، به عنوان متغیر نهایی مرجع نامیده میشود. به عنوان مثال، اعلان یک متغیر StringBuffer نهایی را به صورت زیر در نظر بگیرید:
final StringBuffer sb;
در این مورد، متغیر نهایی ‘sb’ ارجاع به یک شی StringBuffer است. همانطور که میدانیم، یک متغیر Final را نمیتوان دوباره به یک شی دیگر ارجاع داد. با این حال، توجه به این نکته مهم است که وضعیت داخلی شی که توسط متغیر Final مرجع به آن اشاره شده، هنوز قابل تغییر است. این یعنی که عملیاتی مانند افزودن یا تغییر محتوای شی StringBuffer مجاز است.
به طور خلاصه، هنگام استفاده از متغیرهای نهایی، اطمینان حاصل میکنیم که مقادیر آنها ثابت میماند. این بهویژه هنگام برخورد با مقادیری که نباید در طول برنامه تغییر کنند مفید است. علاوه بر این، زمانی که متغیر نهایی Final مرجع به یک شی است، خود متغیر نمیتواند دوباره به یک شیء دیگر ارجاع دهد. با این حال، وضعیت داخلی شی همچنان قابل تغییر است. مثال زیر برای درک این مفهوم بسیار حائز اهمیت است.
// Java Program to demonstrate
// Reference of Final Variable
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating an object of StringBuilder class
// Final reference variable
final StringBuilder sb = new StringBuilder("Maktab");
// Printing the element in StringBuilder object
System.out.println(sb);
// changing internal state of object reference by
// final reference variable sb
sb.append("Khooneh");
// Again printing the element in StringBuilder
// object after appending above element in it
System.out.println(sb);
}
}
ویژگی nontransitivity برای آرایهها نیز صدق میکند، زیرا آرایهها اشیایی در جاوا هستند. به آرایههایی که کلیدواژه نهایی دارند، آرایه نهایی نیز گفته میشود که مثال زیر برای درک این مفهوم آورده شده است.
// Java Program to Demonstrate Re-assigning
// Final Variable will throw Compile-time Error
// Main class
class GFG {
// Declaring and customly initializing
// static final variable
static final int CAPACITY = 4;
// Main driver method
public static void main(String args[])
{
// Re-assigning final variable
// will throw compile-time error
CAPACITY = 5;
}
}
به یاد داشته باشید زمانی که یک متغیر Final در یک «متد/سازنده/بلاک» ایجاد میشود، آن را متغیر Final محلی مینامند و باید یک بار در جایی که ایجاد میشود مقداردهی اولیه شود. مثال زیر را برای متغیر Final محلی ببینید.
چند نکته در مورد متغیر Final در جاوا
توجه به نکات کلیدی زیر در مورد متغیرهای نهایی در جاوا ضروری است:
- تفاوت بین const در زبان سی پلاس پلاس و متغیرهای نهایی جاوا: در C++، به متغیرهای const هنگام اعلام باید مقداری اختصاص داده شود، در حالی که در جاوا، متغیرهای نهایی را میتوان بعداً، اما فقط یک بار، یک مقدار اختصاص داد. این بدان معنی است که متغیرهای Final در جاوا انعطافپذیری را از نظر زمانی که به آنها یک مقدار اختصاص داده میشود، ارائه میدهند.
- Final with foreach loop: استفاده از کلمه کلیدی Final با حلقه foreach (همچنین به عنوان حلقه for بهبودیافته نیز شناخته میشود) یک عبارت معتبر در جاوا است. این به شما اجازه میدهد تا با استفاده از متغیر Final به عنوان متغیر حلقه، روی یک مجموعه یا آرایه عمل پیمایش انجام دهید.
با درک این نکات، میتوانیم به درستی از متغیرهای نهایی در جاوا استفاده و از مزایای آنها در کدمان استفاده کنیم که مثال زیر برای درک این موضوع مهم است:
// Java Program to demonstrate Final
// with for-each Statement
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Declaring and initializing
// custom integer array
int arr[] = { 1, 2, 3 };
// final with for-each statement
// legal statement
for (final int i : arr)
System.out.print(i + " ");
}
}
توضیح خروجی: از آنجایی که متغیر «i» با هر تکرار حلقه از محدوده خارج میشود، در واقع هر تکرار را مجدداً اعلام میکند و به همان اندیس (یعنی i) اجازه میدهد تا برای نشان دادن چندین متغیر استفاده شود.
پیشنهاد مطالعه: تفاوت جاوا و جاوا اسکریپت
کلاس Final در جاوا
هنگامیکه از کلمه کلیدی Final برای اعلام کلاسی استفاده میشود، به آن کلاس نهایی میگویند. کلاس Final یا کلاس نهایی نمیتواند توسط هیچ کلاس دیگری گسترش یابد یا به ارث برسد.
هدف اصلی از اعلام کلاس به عنوان Final، جلوگیری از ارث بردن است. با علامتگذاری کلاس بهعنوان نهایی، اطمینان حاصل میکنیم که نمیتوان آن را بیشتر گسترش داد. یک مثال معمولی از کلاسهای نهایی در جاوا مجموعهای از کلاسهای wrapper مانند Integer ،Float و غیره است. این کلاسهای wrapper بهعنوان Final اعلام میشوند، به این معنی که نمیتوان آنها را زیر کلاس یا گسترش داد.
تصمیم برای نهایی کردن یک کلاس اغلب بر اساس ملاحظات طراحی انجام میشود، جایی که کلاس در نظر گرفته شده است که رفتار خاصی داشته باشد و توسعه یا اصلاح نشود. این یک سطح از کنترل را فراهم میکند و تضمین خواهد کرد که عملکرد کلاس دست نخورده و سازگار باقی میماند.
به طور خلاصه، وقتی یک کلاس به عنوان نهایی علامتگذاری میشود، نمیتوان آن را گسترش داد یا ارث برد. این استفاده از کلاسهای نهایی بهویژه در سناریوهایی مفید است که میخواهیم از گسترش بیشتر جلوگیری کنیم و یکپارچگی رفتار کلاس را حفظ کنیم.
final class A
{
// methods and fields
}
// The following class is illegal
class B extends A
{
// COMPILE-ERROR! Can't subclass A
}
کاربرد دیگر final with classs ایجاد یک کلاس تغییرناپذیر مانند کلاس String از پیش تعریف شده است. نمیتوان یک کلاس را بدون نهایی کردن آن تغییرناپذیر ساخت.
پیشنهاد مطالعه: آموزش hibernate در جاوا
متدهای Final در جاوا
هدف از اعلام متد به عنوان Final، اجرای یک پیادهسازی سازگار در تمام کلاسهای مشتق شده است. هنگامیکه متد به عنوان نهایی در یک سوپرکلاس علامتگذاری میشود، نمیتوان آن را توسط هیچ زیر کلاسی لغو کرد. این تضمین میکند که رفتار متد در همه زیر کلاسها یکسان باقی میماند و از هرگونه تغییری که میتواند منجر به ناسازگاری یا پیامدهای ناخواسته شود، جلوگیری میکند.
نمونهای از متدهای Final را میتوان در کلاس Object در جاوا یافت. چندین متد در کلاس Object، مانند finalize() ،getClass() و wait() به عنوان Final اعلام میشوند. این امر از هر گونه تغییر بیشتر این متدها در زیر کلاسها جلوگیری کرده و رفتار سازگار در همه اشیاء را تضمین میکند.
به طور خلاصه، هنگامیکه متدی به عنوان Final اعلام میشود، نمیتوان آن را در هیچ زیر کلاسی لغو کرد. اینزمانی مفید است که یک پیادهسازی خاص در سراسر سلسلهمراتب وراثت اجرا شود. با استفاده از کلمه کلیدی Final در جاوا با یک متد، میتوانیم ثبات را حفظ کرده و از تغییرات ناخواسته در زیر کلاسها جلوگیری کنیم.
class A
{
final void m1()
{
System.out.println("This is a final method.");
}
}
class B extends A
{
void m1()
{
// Compile-error! We can not override
System.out.println("Illegal!");
}
}
مزایای Final در جاوا
کلمه کلیدی Final در جاوا چندین مزیت قابلتوجه دارد که به شرح موارد زیر است:
- اطمینان از تغییرناپذیری: وقتی یک متغیر یا مرجع به عنوان Final علامتگذاری میشود، پس از تخصیص نمیتوان مقدار آن را تغییر داد. این امر تغییرناپذیری را اعمال میکند و تضمین خواهد کرد که دادههای حیاتی ثابت میمانند و نمیتوانند به طور تصادفی یا عمدی تغییر داده شوند. تغییرناپذیری بهویژه برای ثابتها یا دادههای حساسی که باید بدون تغییر باقی بمانند ارزشمند است.
- بهبود عملکرد: استفاده از Final میتواند با اجازه دادن به ماشین مجازی جاوا (JVM) برای ایجاد فرضیات خاصی در مورد تغییرناپذیری متغیرها یا مراجع، منجر به بهینهسازی عملکرد شود. با این دانش، JVM میتواند کد را به طور موثقتری بهینه کند و منجر به دستاوردهای بالقوه عملکرد شود.
- افزایش درک کد: توسعهدهندگان با اعلام متغیرها، متدها یا کلاسها به عنوان Final در جاوا، درک و استدلال کد خود را آسانتر میکنند. هنگامیکه مقدار یا مرجع به عنوان نهایی علامتگذاری میشود، مشخص خواهد شد که تغییر نخواهد کرد و این تجزیهوتحلیل کد، اشکالزدایی و درک کلی را ساده میکند.
- تشویق به استفاده مجدد از کد: علامتگذاری متدها به عنوان Final مانع از رد کردن زیر کلاسها میشود. این کار استفاده مجدد از کد را ترویج میکند و تکرار را کاهش میدهد. این میتواند به پایگاههای کد قابل نگهداری و سازماندهی بیشتری منجر شود.
- تقویت امنیت: استفاده از Final در جاوا میتواند امنیت را با محافظت از دادههای حساس یا رفتارهای مهم در برابر کدهای مخرب افزایش دهد. متغیرها و متدهای نهایی تضمین میکنند که برخی از جنبههای برنامه غیرقابل تغییر باقی میمانند و یک لایه حفاظتی اضافی در برابر تهدیدات احتمالی اضافه میکنند.
پیشنهاد مطالعه: آشنایی با بازار کار جاوا و درآمد یک برنامهنویس جاوا
سخن پایانی
کلمه کلیدی Final در جاوا ابزاری ارزشمند و همهکاره برای بهبود کیفیت کد و حفظ یکپارچگی برنامه است. توانایی آن در اعمال تغییرناپذیری، افزایش عملکرد، تسهیل درک کد، ترویج استفاده مجدد از کد و افزایش امنیت، آن را به یک جنبه مهم در نوشتن کد جاوا ایمن، قوی و قابل نگهداری تبدیل میکند. با بهکارگیری استراتژیک Final در متغیرها، متدها و کلاسها، توسعهدهندگان میتوانند سیستمهای نرمافزاری قابلاعتمادتر و کارآمدتری ایجاد کنند.
اگر به فکر یادگیری جاوا برای توسعه سیستمها و یا برنامه نویسی Android هستید میتوانید از دورههای آموزش جاوا مکتب خونه استفاده کنید. در مکتب خونه انواع دوره آموزش جاوا با رویکردهای مختلف وجود دارد که از طریق صفحه آموزش جاوا میتوانید از آنها دیدن کنید.
منبع: geeksforgeeks