سؤال

أنا أكتب اختبار وحدة لطريقة تجمع القيم المنطقية في بايت.يتم تحديد مواقع البت المختلفة من خلال قيمة التعداد، الذي يحتوي على 5 قيم فقط في الوقت الحالي، ولكن من الممكن (على الرغم من أنه من غير المرجح للغاية) أن يصل هذا الرقم إلى 9.

أريد اختبارًا بسيطًا على غرار:

البايت الخاص m_myNum؛تعداد MyEnum {...}

تأكيد(sizeof(m_myNum) <= MyEnum.values().length);

لدي انطباع بأنه لا يوجد حجم وظيفة في Java.ما هو الحل الأكثر أناقة؟

---يحرر

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

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

المحلول

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

public void testEnumSizeLessThanOneByte() throws Exception 
{ 
    assertTrue("MyEnum must have 8 or less values.", 
                MyEnum.values().length <= 8);
}

نصائح أخرى

إذا كان هذا مصدر قلق حقيقي والأداء ليس بهذه الأهمية، فيمكنك دائمًا استخدام bitset

في Java، للبايت حجم ثابت (8 بت)، لذا لا حاجة إلى sizeof.

وجدت هذا السؤال قد يساعدك :-)

لسوء الحظ، لا يوجد sizeof() في Java، ولكن قم بإلقاء نظرة على إجابات هذه الأسئلة.واحد وجدته مثيرًا للاهتمام هو هذا المقال من جافا وورلد.

أولاً، نعم، لا يوجد عامل تشغيل sizeof في Java.لكن sizeof(byte) هو دائمًا 1 على أي حال.هل هذا حقا ما كنت تقصد قوله؟

ثانيًا، كيف كنت تنوي احتواء 9 قيم منطقية في بايت واحد؟ليس مع الأقنعة النقطية، كما آمل.

إذا كنت تريد فقط العثور على أعلى بت تم تعيينه، فيمكنك استخدامه Integer.highestOneBit(m_myNum & 0xFF) (انظر المستندات هنا).


يحرر:أنت تتحدث عن تغيير التخزين إلى نوع أكبر عندما يكون هناك عدد كبير جدًا من القيم في التعداد.وفق هذا السؤال, ، لا يوجد سبب في الذاكرة لعدم استخدام ملف byte بدلا من int إلا إذا كان لديك مجموعة.لذلك أود أن أقول استخدام int كحد أدنى، والترقية إلى أ long إذا كان الحجم يتجاوز 32.بسيطا بما فيه الكفاية؟

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

static final int MAX_BITS_IN_MY_NUM = 8; // Currently set to size of a byte.  
                                         // Update if data type changes from byte to something larger than a byte.
...
assertTrue(MAX_BITS_IN_MY_NUM >= MyEnum.values().length);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top