منظور ما از نشان دادن متد کلاس با یک اصلاح کننده
final
این است که هیچ کلاس مشتق شده ای نمی تواند این متد را با تغییر پیاده سازی داخلی آن لغو کند. به عبارت دیگر، ما در مورد نسخه نهایی روش صحبت می کنیم. کلاس به عنوان یک کل نیز می تواند به عنوان علامت گذاری شود final
.
final class NoExtending {
// …
}
کلاسی که به عنوان علامت گذاری شده است final
نمی تواند ارث بری شود و تمام متدهای آن به طور غیرمستقیم این ویژگی را به دست می آورند final
. استفاده از ویژگی a final
در اعلان کلاس ها و متدها می تواند سطح امنیت کد را افزایش دهد. اگر یک کلاس به یک اصلاح کننده مجهز باشد final
، هیچ کس نمی تواند کلاس را تمدید کند و احتمالاً در این فرآیند قرارداد آن را به هم می زند. اگر علامت یک final
روش را نشان می دهد، می توانید به طور کامل به اجرای داخلی آن در همه شرایط بدون ترس از "جعل" اعتماد کنید. final
به عنوان مثال، در اعلان روشی مناسب است که نیاز به تأیید رمز عبور وارد شده توسط کاربر دارد تا اطمینان حاصل شود که دقیقاً آنچه روش در ابتدا در نظر گرفته شده است، انجام می شود. یک مهاجم احتمالی نمیتواند اجرای اصلی چنین روشی را با «لغزش» نسخهای از آن در برنامه تغییر دهد، که مثلاً همیشه مقدار true را برمیگرداند که نشاندهنده ثبت موفقیتآمیز کاربر، صرف نظر از اینکه چه رمز عبوری دارد. او در واقع وارد شد. شما حق دارید، اگر شرایط خاص اجازه می دهد، جلوتر بروید و final
کل کلاس را به عنوان یک کلاس اعلام کنید. روش ValidatePassword
به طور غیرمستقیم همان ویژگی را به دست خواهد آورد. استفاده از یک اصلاح کننده final
در یک متد یا اعلان کلاس، محدودیت های جدی بر امکان استفاده بیشتر و توسعه کد اعمال می کند. استفاده از final
یک روش در یک اعلامیه نشانگر مطمئنی است که پیاده سازی روش مستقل و کاملاً کامل است. سایر برنامه نویسانی که می خواهند از کلاس شما استفاده کنند و عملکردهای آن را متناسب با نیازهای خود گسترش دهند، در انتخاب وسایل برای رسیدن به هدف خود محدود خواهند بود یا به طور کامل از آنها محروم خواهند شد. با علامتگذاری final
یک کلاس بهعنوان یک کل، قابلیت ارثی بودن آن را غیرفعال میکنید و احتمالاً مفید بودن آن را برای دیگران به میزان قابل توجهی کاهش میدهید. وقتی میخواهید از اصلاحکننده استفاده کنید final
، مطمئن شوید که آیا برای چنین قربانیهایی آماده هستید و آیا ارزش انجام آنها را دارد یا خیر. در بسیاری از موارد، برای دستیابی به سطح کافی از امنیت کد، لازم نیست کل کلاس را بهعنوان مشخص کنیم final
- میتوان با علامتگذاری final
تنها عناصر ساختاری «بحرانی» آن با یک اصلاحکننده، توسعهپذیری کلاس را حفظ کرد. در این صورت، عملکردهای اصلی کلاس را دست نخورده می گذارید و در عین حال با اضافه کردن اعضای جدید، اما بدون تعریف مجدد اعضای «قدیمی»، اجازه ارث بردن آن را می دهید. البته، فیلدهایی که کد متدها به آنها دسترسی دارند باید به نوبه خود به عنوان یکی final
تعیین شوند ، زیرا در غیر این صورت هر کلاس مشتق شده می تواند محتویات خود را تغییر دهد و بر رفتار متدهای مربوطه تأثیر بگذارد. یکی دیگر از اثرات استفاده از اصلاح کننده مربوط به ساده کردن مشکل بهینه سازی کد حل شده توسط کامپایلر است. این چیزی است که زمانی اتفاق می افتد که متدی که به عنوان علامت گذاری نشده است فراخوانی شودfinal
private
final
final
، سیستم زمان اجرا کلاس واقعی شی را تعیین می کند، فراخوانی را با مناسب ترین کد از گروه متدهای بارگذاری شده مرتبط می کند و کنترل را به آن کد منتقل می کند. اما اگر، برای مثال، متد getName
در مثال کلاس که Attr
قبلاً مورد بحث قرار گرفت، به عنوان تعیین شده بود final
، عملیات فراخوانی آن ممکن است به طور قابل توجهی ساده شده باشد. در بی اهمیت ترین موارد، مانند مورد مربوط به getName
کامپایلر، به سادگی می تواند فراخوانی متد را با کد بدنه خود جایگزین کند. به این مکانیسم، کد درون خطی می گویند. هنگام استفاده از نسخه درون خطی متد، getName
دو عبارت زیر دقیقاً یکسان اجرا می شوند:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
اگرچه عبارات فوق معادل هستند، اما دومی هنوز دارای یک مزیت است، زیرا این روش getName
به شما امکان می دهد به فیلد نام یک ویژگی فقط خواندنی بدهید و کد کلاس درجه خاصی از انتزاع داشته باشد که به شما امکان می دهد آزادانه تر تغییر دهید. پیاده سازی کلاس همان طرح بهینهسازی را میتوان توسط کامپایلر برای متدهای private
و اعمال کرد statiс
، زیرا آنها نیز اجازه رد کردن را نمیدهند. استفاده از یک اصلاح کننده final
در اعلان های کلاس نیز برخی از عملیات بررسی نوع را کارآمدتر می کند. در این مورد، بسیاری از این عملیات را می توان در مرحله کامپایل انجام داد و بنابراین خطاهای احتمالی خیلی زودتر شناسایی می شوند. اگر کامپایلر با ارجاع به یک کلاس در متن مبدأ مواجه شود final
، میتواند "مطمئن شود" که شی مربوطه از نوع مشخص شده است. کامپایلر قادر است بلافاصله مکان اشغال شده توسط یک کلاس را در سلسله مراتب کلی کلاس تعیین کند و بررسی کند که آیا از آن به درستی استفاده شده است یا خیر. اگر اصلاح کننده final
اعمال نشود، بررسی های مربوطه فقط در مرحله اجرای برنامه انجام می شود. تمرین 3.4. آیا توصیه میشود که اصلاحکننده نهایی را در اعلامیههای روش (و اگر چنین است، کدام یک) از کلاسهای خودرو و وسایل نقلیه مسافربری درج کنید ؟ لینک به منبع اصلی: http://src-code.net/metody-i-klassy-final-java
GO TO FULL VERSION