هل يبقى المتغير النهائي الذي تم تمريره في جافا نهائيًا على الجانب الآخر؟
-
21-09-2019 - |
سؤال
لقد صادفت للتو بعض الكود الذي يربكني قليلاً ؛ هناك بالفعل اختلافان أود توضيحهما.
مثال 1:
public String getFilepath(){
final File file = new File(this.folder, this.filename);
return file.getAbsolutePath();
}
ماذا سيكون الغرض من الإعلان file
"final
"؟ بما أن جافا البدائية يتم تمريرها بالقيمة ، و getAbsolutePath()
هو مجرد العودة أ String
, ، لن يكون المتغير final
على الجانب الآخر (طريقة الاتصال) ، أليس كذلك؟ ومنذ file
متغير موجود فقط في نطاق هذين الخطين ، لا يمكنني رؤية أي غرض من final
الكلمة الرئيسية. هل هناك شيء أفتقده؟ أي شخص يرى سببا للقيام بذلك؟
مثال 2:
public String getFilepath(){
final File file = new File(this.folder, this.filename);
return file;
}
منذ هنا يتم إرجاع الكائن الفعلي ... هل هذا يعني file
سيكون المتغير ثابتًا/final
على الجانب الآخر...؟ لا يبدو من المنطقي.
بشكل عام ، يبدو لي أنك تمرر متغيرًا ، بدون إنه نوع الوصول. كما في ، يمكنني الحصول على ملف private
متغير في وظيفة مع أ public
احصل على وظيفة تُرجعها - لكن المتغير الذي يتلقىها عن طريق استدعاء الوظيفة يجب أن يحدد معدل الوصول. لذلك إذا كان يحدد public
, ، المتغير الذي تم إرجاعه سيكون public
في هذا النطاق. إذا كان يحدد private
, ، المتغير الذي تم إرجاعه سيكون private
في هذا النطاق. هل هناك فرق مع final
؟ هل "ثبات" متغير شيء يمكن تمريره؟ هذا يذهلني على أنه غير محتمل إلى حد ما ، بالنظر إلى ما أعرفه عن جافا.
أو هل أفتقد هذه النقطة تمامًا وهناك غرض آخر من final
الكلمة الرئيسية في الكود أعلاه؟
يحرر:
راجعت مرة أخرى مع المطور الأصلي الذي كتب الرمز ، وقال إنه وضع فقط final
الكلمة الرئيسية في لأنه اعتقد في الأصل أن الطريقة ستكون أطول بكثير وأراد التأكد من بقاء الملف ثابتًا طوال الوقت. وقال أيضًا إنه يعلن بشكل عام المتغيرات التي لا ينبغي تغييرها final
, ، كقاعدة عامة في جميع المجالات ونوعًا من المبدأ - وهي نقطة يردها كلتا الإجابات أدناه. لذلك يبدو أنني كنت أقرأ الكثير في كلمة رئيسية إضافية بسيطة مضمنة لأسباب معايير. شكرا لكم جميعا!
المحلول
قد يخبرك بعض الأشخاص أن هناك فائدة أداء لاستخدام النهائي ، ولكن هذا ، لا يوجد بأي حال من الأحوال قد أثبتت قاطعًا.
الفائدة الأساسية من final
الكلمة الرئيسية هي أن يشير المبرمج إلى أنه لا ينبغي تغيير الفصل أو الطريقة أو الحقل.
ضع في اعتبارك أن إعلان متغير final
لا يجعل الكائن المشار إليه غير قابل للتغيير. هذا يعني فقط أن المتغير لا يمكن أن يتم إعادة تعيين قيمة. لا يزال بإمكانك تشغيل طرق المتغير file
يمكن أن يغير File
اعتراض داخليًا.
في الطريقتين اللتين تعطيهما ، لا أرى قيمة في صنع file
عامل final
. بعض اتفاقيات التعليمات البرمجية تدعو إلى جعل كل المتغيرات final
ما لم يتم تعديل الحاجة. بعض الناس لا يشتركون في ذلك. أنا أعتبره تباينًا في المبدأ الوقائي.
نصائح أخرى
final
في هذه الحالة يعني فقط أن المرجع المحلي file
سيكون غير قابل للتغيير. ليس له معنى خارج الطريقة. تدافع بعض اتفاقيات الترميز عن وجود جميع المتغيرات النهائية ما لم تكن بحاجة إلى أن تكون قابلة للتغيير حتى ترى رمزًا مثل ذلك عندما يتابع شخص ما هذه الإرشادات.