سؤال

ما هو المتغير النهائي في جافا؟ على سبيل المثال: إذا كتبت final int temp; في الوظيفة ما معنى الكلمة الرئيسية النهائية؟
أيضًا ، متى أرغب في استخدام المتغير النهائي (كمتغير فئة ومتغير دالة)؟
لماذا يجب الإعلان عن المتغيرات في كتلة متزامنة نهائي؟

هل كانت مفيدة؟

المحلول

في الأساس ، يعني أنه لا يمكنك تغيير القيمة. على سبيل المثال متغيرات ، يجب عليك تعيين أي متغيرات نهائية مرة واحدة (وفقط مرة واحدة) في المُنشئ (أو مع مُعمى متغير). التزامن هو مفهوم متعامد جدا.

السبب الرئيسي لعمل ملف محلي المتغير النهائي هو حتى تتمكن من استخدامه في فئة داخلية مجهولة الهوية ... هذا لا علاقة له بالوجود في كتلة متزامنة.

المتغيرات النهائية نكون من المفيد للدروس غير القابلة للتغيير ، من المسلم به أن التثبات يجعل الحياة أسهل في بيئة متعددة الخيوط - ولكن هذه هي العلاقة الوحيدة بين الاثنين التي يمكنني التفكير فيها ...

تحرير: تعليق Wildwezyr أمر منطقي من حيث عدم تغيير المتغير التي تتم مزامنتها. سيكون ذلك خطيرًا ، للأسباب التي قدمها. هل هذا ما قصدته بـ "متغير في كتلة متزامنة"؟

نصائح أخرى

المتغيرات النهائية وكتل الرمز المتزامن لها شيء مشترك ... إذا أعلنت متغيرًا غير نهائي a ثم اكتب synchronized (a) { System.out.println('xxx'); } سوف تحصل على تحذير "التزامن في المجال غير النهائي" - على الأقل في NetBeans.

لماذا لا ينبغي أن تتم مزامنة في مجال غير نهائي؟ لأنه إذا كانت قيمة الحقل قد تتغير ، فقد تتم مزامنة مؤشرات الترابط المختلفة على كائنات مختلفة (قيم مختلفة من الحقل) - لذلك لا يمكن أن يكون هناك مزامنة على الإطلاق (قد يدخل كل مؤشر ترابط كتلة متزامنة في نفس الوقت).

انظر هنا على سبيل المثال عن مشكلة في الحياة الواقعية الناتجة عن التزامن في مجال غير نهائي: http://forums.sun.com/thread.jspa؟threadid=5379204

بالإضافة إلى ما قاله جون سكيت ، لا يمكن تغيير القيمة ولكن قد يتم تغيير المحتويات.

final Integer one = new Integer(1);
...
one = new Integer(2); // compile error

final List list = new ArrayList();
...
list = new ArrayList(); // compile error
list.add(1); // Changes list, but that's fine!

كن على علم أيضًا بأن النهائي النهائي والستاتي ليس هو نفسه. النهائي هو ضمن نطاق المثيل ، في حين أن النهائي الثابت هو نفسه بالنسبة لجميع حالات الفصل (بلغات أخرى يمكن أن يطلق عليها هذا ثابت).

أنا شخصياً أعتقد أن ميزة النهائي ، حتى عندما لا تكون مطلوبة على الإطلاق لعمل البرمجيات الخاصة بك ، في المعنى الدلالي. إنه يوفر لك إمكانية أن تقول للمترجم والشخص التالي يعمل على هذا الرمز أن هذا المتغير لا يُقصد منه تغييره ، وأن محاولة تغييره قد تؤدي إلى خطأ.

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