سؤال

عندما أمر غير قابل للتغيير نوع الكائن(String, Integer,..) بصيغتها النهائية إلى طريقة أستطيع تحقيق الأحرف من a C++ ثابت المؤشر.ولكن كيف يمكن فرض مثل هذا السلوك في الكائنات التي هي قابلة للتغيير?

public void someMethod(someType someObject){
 /*
  * code that modifies the someObject's state
  * 
  */
}

كل ما أريده هو منع someMethod من تعديل حالة someObject دون إجراء أي تغيير في someType.هل هذا ممكن ؟

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

المحلول

لا, لا أعتقد أن هذا ممكن.العادي هو إنشاء محول SomeType فيها كل أساليب تغيير الدولة يلقي UnsupportedOperationException.هذا يستخدم من قبل فعلى سبيل المثال جافا.util.مجموعات.unmodifiable*-وظائف.

وهناك عدة نهج هذا:

  • يمكنك أن تدع SomeType تكون واجهة, و عندما كنت في حاجة إليها تكون للقراءة فقط, فقط قم بإنشاء المجمع تفويض كل قراءة-أساليب الكائن الأصلي وتنفيذ جميع الكتابة أساليب رمي استثناء.
  • أو يمكنك إنشاء مجموعة فرعية من SomeType تجاوز كل أساليب الكتابة

هذا بالطبع سوف تعطيك وقت تشغيل التحقق لا compiletime.إذا كنت تريد تجميع الوقت, يمكنك أن تدع SomeType تكون واجهة (أو الفائقة) مع عدم كتابة-طرق قراءة فقط.

نصائح أخرى

في الحالة العامة، لا، انها ليست ممكنة. في قضية محدودة جدا، يمكنك لف someType في فئة التي توفر نفس واجهة (انظر Collections.unmodifiableList () للحصول على مثال).

ومع ذلك، ليس هناك ما يعادل "تمرير مؤشر CONST وسوف مترجم تسمح لك لاستدعاء وظائف CONST على ذلك".

لا، لا يمكن أن تمنع الكائن يتم تعديل عبر setXXX لها () (أو ما شابه) الأساليب. هل يمكن تسليم استنساخ أو نسخة منه، وإن كان.

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

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