أفضل الممارسات لاستخدام الأعلام في طريقة جافا

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

  •  07-09-2020
  •  | 
  •  

سؤال

ما هي أفضل الممارسات لتحديد الأعلام في طريقة جافا?

لقد رأيت سوت باستخدام إنت كما بيتفيلدز ، مثل:

(مثال جزئيا من " جافا فعالة ، 2 إد."صفحة 159):

public class Text {
  public static final int STYLE_BOLD = 1 << 0; // 1
  public static final int STYLE_ITALIC = 1 << 1; // 2

  void printText(String text, int flags) {

  }
}

ودعوة العميل الخاص بك يبدو مثل:

printText("hello", Text.STYLE_BOLD | Text.STYLE_ITALIC);

..ولكن هذا هو تثبيط كما يمكنك مختلطة الأعلام (القيم إنت) من فئات مختلفة معا دون أي الشيكات مترجم.

في نفس الكتاب ("جافا فعالة") ، أرى استخدام إنومسيت ، ولكن بعد ذلك يصبح مكالمة المستخدم الخاص بك:

printText("hello", EnumSet.of(Style.Bold, Style.ITALIC));

أجد هذا مطول قليلا وأنا أفضل أناقة اليوم وغدا.

هل هناك أي بديل آخر أم أن هذا هو في الأساس الأذواق اثنين يجب عليك اختيار?

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

المحلول

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

giveacodicetagpre.

نصائح أخرى

إذا كنت تريد أعلام نمط بت ، جافا يلتف لهم في BitSet.انها كانت موجودة للأعمار ، ولكن عدد قليل من الناس عناء استخدامه (مفضلا تضمين ج أسلوب التعامل مع بت في إنتس).

يمكن العثور على أبي ل بيتسيت هنا.

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

أنصح بأنك تذهب مع نهج الأجيال.

giveacodicetagpre.

يوفر هذا النهج سلامة أفضل من النوع، وسوف يكون GuardCodicetAcheTagCode أن يكون هناك إمكانيات OO في المنفأة بالكامل.

الإجابة المتأخرة لأي شخص يأتي عبر هذا.إليك طريقة واحدة للقيام بذلك لتقليل الذاكرة ولديها Enum لطيفة مثل API:

giveacodicetagpre.

الطريقة:

giveacodicetagpre.

اتصل:

giveacodicetagpre.

إذا كان لديك فقط عدد محدود من الأساليب التي سوف تتخذ مجموعة من الأساليب (مثل printText, ، في المثال الخاص بك) ، يمكنك تعديل توقيعهم لأخذ عدد متغير من معلمات النمط:

void printText(String text, Style... flags) {
  EnumSet<Style> style = logicalOr(flags); // see comment below
  ...
 }

ومن ثم تكون مكالماتك قريبة جدا من مسار العلم غير المكتوب (إنت) :

printText("hello", Style.BOLD, Style.ITALIC);

للأسف ، لا يوجد EnumSet.of(E... ) مصنع ، فقط EnumSet.of(E first, E... more), ، لذلك ستحتاج إلى عام logicalOr طريقة لتقسيم الصفيف الخاص بك إلى قطع الراحة الأولى. اليسار كتمرين للقارئ =).

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