هل يبقى المتغير النهائي الذي تم تمريره في جافا نهائيًا على الجانب الآخر؟

StackOverflow https://stackoverflow.com/questions/2297226

سؤال

لقد صادفت للتو بعض الكود الذي يربكني قليلاً ؛ هناك بالفعل اختلافان أود توضيحهما.

مثال 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 سيكون غير قابل للتغيير. ليس له معنى خارج الطريقة. تدافع بعض اتفاقيات الترميز عن وجود جميع المتغيرات النهائية ما لم تكن بحاجة إلى أن تكون قابلة للتغيير حتى ترى رمزًا مثل ذلك عندما يتابع شخص ما هذه الإرشادات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top