لماذا يسمح المعدل "المحمي" في Java بالوصول إلى الفئات الأخرى في نفس الحزمة؟

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

  •  05-09-2019
  •  | 
  •  

سؤال

ما هو السبب في أنه في Java، لا يمكن الوصول إلى العضو الذي لديه مُعدِّل "محمي" فقط من خلال نفس الفئة والفئات الفرعية، ولكن أيضًا من قبل الجميع في نفس الحزمة؟

أتساءل عن أسباب تصميم اللغة، وليس التطبيقات الفعلية (مثل الاختبار)

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

المحلول

يعتمد هذا التصميم على فكرة أن الحزمة هي الوحدة المناسبة، وحافظت عليها وأصدرها فريق ثابت داخليا؛ علاقات الميراث أقل بكثير للقيام به مع الحفاظ على ما هي متى.

نصائح أخرى

المعدلات موصوفة جيدا على http://java.sun.com/docs/Books/tutorial/java/javaoo/accesscontrol.html.. وبعد من هناك نرى هذا الرقم.

Modifier        Class     Package   Subclass  World
public          Y         Y         Y         Y
protected       Y         Y         Y         N
no modifier     Y         Y         N         N
private         Y         N         N         N

من هذا السبب لقرار التصميم واضح: سيكون له مصفوفة متماثلة لطيفة.

في Java 1.0 كان هناك معدّل وصول خامس: private protected.لقد كان هذا protected دون الوصول الافتراضي.من الواضح أنه لم يعمل بشكل صحيح أبدًا وتم إسقاطه في 1.1.لذلك يبدو أن يدعي protected يتم تعريفه بالطريقة التي يبدو بها الترتيب الإجمالي زائفًا.(يحرر: يبدو أن واحدًا على الأقل من أسباب إزالة معدّل الوصول الخامس في الإصدار 1.1 هو أن عدم وجود ترتيب إجمالي يتداخل مع قواعد اختيار التحميل الزائد.) module يحتوي معدّل الوصول في Java 7 على بعض أسئلة التصميم في هذا المجال.

نظرًا لأنه كان من المعتقد أنه سيكون فكرة جيدة أن يكون معدل الوصول الافتراضي للأعضاء "حزمة خاصة"، يبدو من المعقول أن protected ينبغي أن يكون على الأقل هذا المستوى من الوصول.من أجل أموالي، protected لا يدفع طريقه في اللغة على الإطلاق.

في الأساس يجب القيام به بمنظر حزمة كوحدة تسيطر عليها API (من هنا توصية بدء الحزمة الخاصة بك مع اسم النطاق الخاص بك - تفرد عالمي مضمون)، لذلك تنمو الرؤية من Private -> Package-Private -> المحمية -> الجمهور وبعد إذا لم تكن محمية لم تكن زيادة على الحزمة الخاصة، فما نوع مختلف من الرؤية، يجب أن يكون هناك طريقة للدمج بين النوعين من الرؤية عند الحاجة.

نظرا لمستويات الوصول التدريجي والوصول والخاصة والحزمة المحمية والجمهور، سيكون من المقيد بشكل غير ضروري إذا سار حمايتها ثم الحزمة لأن ذلك من شأنه أن يجبرني على السماح بالوصول الفيزيؤيات من أجل منح الأعضاء الآخرين في نفس الحزمة. ومع ذلك، ينبغي أن يكون الأمر بشكل حدسي، أن الطبقات الأخرى في نفس الحزمة هي جديرة بالثقة أكثر من الطبقات الأخرى "هناك". محمي جدا بين الحزمة والجمهور في أنه يسمح بتعرض أوسع للوصول.

أعتقد أن السبب الأساسي يعتمد على الحدس الذي يوجد به مستوى أساسي من "الثقة" بين الفصول الدراسية في نفس الحزمة؛ يمكنك أن تتوقعها بشكل معقول أن تفعل الشيء الصحيح مع بعضها البعض - في معظم الحالات، ستكون الحزمة هي مسؤولية مهندس واحد أو فريق لذلك يجب أن يكون هناك وئام متسق للتصميم.

يتبع جافا مبادئ التصميم الخاصة به على نفسه. ماذا يحدث عند محاولة تقليل / ضيقة نطاق الطريقة العامة في فرعية؟ واحد يحصل على خطأ. مستويات معدلات نطاق جافا تتبع: خاص <(افتراضي) <محمية <public

من المفترض أن تكون كل فئة في الحزمة ودودا لأنها تعمل معا. لإتاحة العضو في الحزمة، يتم تعريفه في النطاق الافتراضي.

قد يقيم الفرعية خارج الحزمة، بعد مستويات النطاق مرة أخرى: <(افتراضي) <(افتراضي) <محمي <public - لا يمكننا تضييق نطاق النطاق. المحمية هو نطاق أوسع من الافتراضي جافا لا يتناقض مع إرشاداته الخاصة. وبعد وبالتالي، سيكون العضو المحمي متاحا في النطاق الافتراضي. أيضا: الفئة <package <project.

يرجى عدم الحد من المعدلات إلى الرؤية فقط، ولكن الميراث، هي الهيكل في العمل أيضا في نفس الوقت وإضافتها إلى الصورة أيضا. إذا كان هذا صحيحا: خاص <محمي <(افتراضي) <public. ثم يجب أن تتضطر جميع الفصول الفرعية إلى الإقامة في نفس الحزمة، ثم لماذا تحتاج إلى الوراثة يمكنك الوصول إلى كل شيء كجهاز افتراضي موجود في مستوى الحزمة. كان النطاق الافتراضي قد فقد قيمته وكذلك الميراث.

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