سؤال

لدي حزمة مع

public abstract class Player { /*...*/ }

و هؤلاء

public abstract class GamePlayer extends Player { /*...*/ }
public abstract class TournamentPlayer extends Player { /*...*/ }
public abstract class StatelessPlayer extends Player { /*...*/ }

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

سؤال: كيف يجب أن أمنع المستخدمين من تمديد اللاعب مباشرة؟

أبحث عن طريقة تجعل الأمر واضحا أن هذا الحظر هو المقصود.

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

المحلول

جعل المنشئين في Player لديك حزمة الوصول فقط فقط. ثم لن يتمكنوا من الاتصال بالبناء أو تمديدها بأنفسهم. إذا لم تكن بالفعل يملك منشئ واضح في Player, ، قم بإنشاء واحد (كما خلاف ذلك، سيقوم المحول البرمجي بإنشاء منشئ غير رسمي عادي).

(لاحظ أنني اقترحت فقط القيام بذلك إلى البناء. وبعد يمكن أن يكون الفصل نفسه عاما حتى لا يزال بإمكان العملاء استخدامه.)

هذا يعمل لأن أي منشئ (بخلاف java.lang.Object) يجب أن نسمي منشئ سوبرشراس (إما صراحة أو ضمنيا). إذا لم يكن هناك منشورات يمكن الوصول إليها، فلن تتمكن من إنشاء الفئة الفرعية.

نصائح أخرى

تأكد من أن منشئين لاعب ليسوا عامين:

public abstract class Player {
    Player() {
        // initialization goes here
    }
}

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

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

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

أود أن أوصي

  • إنشاء واجهات عامة للأشياء التي تريد الوصول إليها للعملاء ولكن لا تنشئ أو فرعية
  • إنشاء فصول عامة للأشياء التي تريد الوصول إليها للعملاء و إنشاء أو فئة فرعية
  • يجب أن يكون أي شيء آخر غير عام

المشكلة في هذا النهج هي أنه في نهاية المطاف مع كل شيء يحتاج إلى أن يكون في حزمة واحدة، وهو أمر سيء للمنظمة حيث تنمو المكتبة.

للسماح باستخدام حزم متعددة مع الحماية، نلقي نظرة على OSGI.

يسمح لك Osgi بتقييد الحزم التي تسمح الحزم (JAR) بحزم أخرى للوصول إليها، وحتى إعداد حزم "صديق" مسموح بها من رؤية إضافية.

نموذج وحدة الحماية في حزمة Java لا يكفي عندما تريد حقا حماية المكتبات التي تحصل على ...

استخدم معدل الوصول الافتراضي، والمعروف أيضا باسم الوصول "حزمة خاصة". وبعبارة أخرى، لا تحدد معدل الوصول

abstract class Player { /*...*/ }

ال الوثائق هنا في موقع صن يصف جميع معدلات الوصول بمزيد من التفاصيل.

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