JavaRush /وبلاگ جاوا /Random-FA /متدها و کلاس های نهایی جاوا
articles
مرحله

متدها و کلاس های نهایی جاوا

در گروه منتشر شد
منظور ما از نشان دادن متد کلاس با یک اصلاح کننده finalاین است که هیچ کلاس مشتق شده ای نمی تواند این متد را با تغییر پیاده سازی داخلی آن لغو کند. به عبارت دیگر، ما در مورد نسخه نهایی روش صحبت می کنیم. کلاس به عنوان یک کل نیز می تواند به عنوان علامت گذاری شود final. متدها و کلاس های جاوا نهایی - 1
final class NoExtending {
// …
}
کلاسی که به عنوان علامت گذاری شده است finalنمی تواند ارث بری شود و تمام متدهای آن به طور غیرمستقیم این ویژگی را به دست می آورند final. استفاده از ویژگی a finalدر اعلان کلاس ها و متدها می تواند سطح امنیت کد را افزایش دهد. اگر یک کلاس به یک اصلاح کننده مجهز باشد final، هیچ کس نمی تواند کلاس را تمدید کند و احتمالاً در این فرآیند قرارداد آن را به هم می زند. اگر علامت یک finalروش را نشان می دهد، می توانید به طور کامل به اجرای داخلی آن در همه شرایط بدون ترس از "جعل" اعتماد کنید. finalبه عنوان مثال، در اعلان روشی مناسب است که نیاز به تأیید رمز عبور وارد شده توسط کاربر دارد تا اطمینان حاصل شود که دقیقاً آنچه روش در ابتدا در نظر گرفته شده است، انجام می شود. یک مهاجم احتمالی نمی‌تواند اجرای اصلی چنین روشی را با «لغزش» نسخه‌ای از آن در برنامه تغییر دهد، که مثلاً همیشه مقدار true را برمی‌گرداند که نشان‌دهنده ثبت موفقیت‌آمیز کاربر، صرف نظر از اینکه چه رمز عبوری دارد. او در واقع وارد شد. شما حق دارید، اگر شرایط خاص اجازه می دهد، جلوتر بروید و finalکل کلاس را به عنوان یک کلاس اعلام کنید. روش ValidatePasswordبه طور غیرمستقیم همان ویژگی را به دست خواهد آورد. استفاده از یک اصلاح کننده finalدر یک متد یا اعلان کلاس، محدودیت های جدی بر امکان استفاده بیشتر و توسعه کد اعمال می کند. استفاده از finalیک روش در یک اعلامیه نشانگر مطمئنی است که پیاده سازی روش مستقل و کاملاً کامل است. سایر برنامه نویسانی که می خواهند از کلاس شما استفاده کنند و عملکردهای آن را متناسب با نیازهای خود گسترش دهند، در انتخاب وسایل برای رسیدن به هدف خود محدود خواهند بود یا به طور کامل از آنها محروم خواهند شد. با علامت‌گذاری finalیک کلاس به‌عنوان یک کل، قابلیت ارثی بودن آن را غیرفعال می‌کنید و احتمالاً مفید بودن آن را برای دیگران به میزان قابل توجهی کاهش می‌دهید. وقتی می‌خواهید از اصلاح‌کننده استفاده کنید final، مطمئن شوید که آیا برای چنین قربانی‌هایی آماده هستید و آیا ارزش انجام آن‌ها را دارد یا خیر. در بسیاری از موارد، برای دستیابی به سطح کافی از امنیت کد، لازم نیست کل کلاس را به‌عنوان مشخص کنیم final- می‌توان با علامت‌گذاری finalتنها عناصر ساختاری «بحرانی» آن با یک اصلاح‌کننده، توسعه‌پذیری کلاس را حفظ کرد. در این صورت، عملکردهای اصلی کلاس را دست نخورده می گذارید و در عین حال با اضافه کردن اعضای جدید، اما بدون تعریف مجدد اعضای «قدیمی»، اجازه ارث بردن آن را می دهید. البته، فیلدهایی که کد متدها به آنها دسترسی دارند باید به نوبه خود به عنوان یکی finalتعیین شوند ، زیرا در غیر این صورت هر کلاس مشتق شده می تواند محتویات خود را تغییر دهد و بر رفتار متدهای مربوطه تأثیر بگذارد. یکی دیگر از اثرات استفاده از اصلاح کننده مربوط به ساده کردن مشکل بهینه سازی کد حل شده توسط کامپایلر است. این چیزی است که زمانی اتفاق می افتد که متدی که به عنوان علامت گذاری نشده است فراخوانی شودfinalprivatefinalfinal، سیستم زمان اجرا کلاس واقعی شی را تعیین می کند، فراخوانی را با مناسب ترین کد از گروه متدهای بارگذاری شده مرتبط می کند و کنترل را به آن کد منتقل می کند. اما اگر، برای مثال، متد 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
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION