English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
استخدام enum Java
استخدام الطريقة الأولى: المعادلات
قبل JDK1.5، كنا نحدد المعادلات كما يلي: public static fianl.... الآن، مع المجموعات، يمكننا جمع المعادلات ذات الصلة في نوع مجموعة واحدة، وتقدم المجموعات ميزات أكثر من المعادلات.
public enum Color { RED, GREEN, BLANK, YELLOW }
استخدام الطريقة الثانية: switch
قبل JDK1.6، دعم جملة switch فقط لتصنيفات int،char،enum. باستخدام المجموعات، يمكن أن تكون كودنا أكثر قراءة.
enum Signal { GREEN, YELLOW, RED } public class TrafficLight { Signal color = Signal.RED; public void change() { switch (color) { حالة RED: color = Signal.GREEN; break; حالة YELLOW: color = Signal.RED; break; حالة GREEN: color = Signal.YELLOW; break; } } }
استخدام الطريقة الثالثة: إضافة طريقة جديدة إلى المجموعة
إذا كنت تخطط لتعريف طريقتك الخاصة، فإنه يجب عليك إضافة نقطة السطر في نهاية سلسلة نماذج القائمة. ويتطلب Java تعريف نماذج القائمة أولاً.
public enum Color { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造函数 private Color(String name, int index) { this.name = name; this.index = index; } // طريقة عادية public static String getName(int index) { for (Color c : Color.values()) { if (c.getIndex() == index) { return c.name; } } return null; } // طرق get و set public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
استخدام الرابع: تغطية طريقة القائمة
إليك مثال على تغطية طريقة toString().
public class Test { public enum Color { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造函数 private Color(String name, int index) { this.name = name; this.index = index; } // تغطية الطريقة @Override public String toString() { return this.index + "_" + this.name; } } public static void main(String[] args) { System.out.println(Color.RED.toString()); } }
استخدام الخامس: تنفيذ الواجهة
جميع القوائم ت 继د من فئة java.lang.Enum. لأن Java لا يدعم الت 继د المتعدد، لذا لا يمكن للعناصر القوائم أن ت 继د من فئة أخرى.
public interface Behaviour { void print(); String getInfo(); } public enum Color implements Behaviour { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造函数 private Color(String name, int index) { this.name = name; this.index = index; } // 方法接口 @Override public String getInfo() { return this.name; } // 方法接口 @Override public void print() { System.out.println(this.index + ":" + this.name); } }
استخدام السادس:استخدام واجهة تنظيم النوع الحسابي
public interface Food { enum Coffee implements Food { BLACK_COFFEE،DECAF_COFFEE,LATTE،CAPPUCCINO } enum Dessert implements Food { FRUIT،CAKE،GELATO } }
استخدام السابع:استخدام مجموعات النوع الحسابي
java.util.EnumSet وjava.util.EnumMap هما مجموعتان من النوع الحسابي.تضمن EnumSet عدم تكرار العناصر في المجموعة؛ بينما في EnumMap، تكون المفتاح نوع الحسابي، بينما يمكن أن تكون القيمة أي نوع.لا يتم مناقشة استخدام هاتين المجموعتين هنا، يرجى الرجوع إلى وثائق JDK.
الفرق بين النوع الحسابي والمعادلات
أولاً، طريقة التعريف العادية للمعادلات
عادةً نستخدم كود public final static كالتالي، حيث نستخدم الرقم 1 لتعريف الأحمر، الرقم 3 لتعريف الأخضر، والرقم 2 لتعريف الأصفر.
public class Light { /* الأخضر */ public final static int RED = 1; /* الأحمر */ public final static int GREEN = 3; /* الأصفر */ public final static int YELLOW = 2; }
ثانيًا، طريقة تعريف النوع الحسابي للمعادلات
طريقة التعريف البسيطة لنوع الحساب التالي، يبدو أننا لا نستطيع تعريف كل قيمة من أنواع الحساب.على سبيل المثال، قد يكون كود تعريف الألوان كالتالي:
public enum Light { أحمر،أخضر،أصفر; }
نحن لا نستطيع تمثيل الألوان بشكل صحيح، ولكن لا تقلق، لأن نوع الحساب يقدم معادلة بناء، يمكننا من خلال معادلة البناء وتعديل طريقة toString تحقيق ذلك.أولاً، نضيف طريقة بناء لنوع Light، ثم نأتي بكل قيمة من أنواع الحساب من خلال معادلة البناء، ونعدل طريقة toString، حيث نعيد فيها المعاملات التي تم تقديمها من خلال معادلة البناء، والكود المعدل كالتالي:
public enum Light { //استخدام المعادلة لتقديم المعلمات أحمر(1)،أخضر(3)،أصفر(2); // تعريف متغير خاص private int nCode; // مكون بناء، أنواع التجميع يجب أن تكون خاصة private Light(int _nCode) { this.nCode = _nCode; } @Override public String toString() { return String.valueOf(this.nCode); } }
ثالثًا، كود المثال الكامل
كود مثال شامل لنوع الحساب التالي:
public class LightTest { //1.تحديد نوع الحساب public enum Light { //استخدام المعادلة لتقديم المعلمات أحمر(1)،أخضر(3)،أصفر(2); // تعريف متغير خاص private int nCode; // مكون بناء، أنواع التجميع يجب أن تكون خاصة private Light(int _nCode) { this.nCode = _nCode; } @Override public String toString() { return String.valueOf(this.nCode); } } /** * * @param args */ public static void main(String[] args) { // 1. مرور أنواع التجميع System.out.println("عرض مرور أنواع التجميع ......"); testTraversalEnum(); // 2. عرض استعمال Map من نوع EnumMap System.out.println("عرض استعمال ومرور Map من نوع EnumMap....."); testEnumMap(); // 3. عرض استعمال Map من نوع EnumSet System.out.println("عرض استعمال ومرور Map من نوع EnumSet....."); testEnumSet(); } /** * * عرض استعمال التجميع من نوع Enum */ private static void testTraversalEnum() { Light[] allLight = Light.values(); for (Light aLight : allLight) { System.out.println("اسم الضوء الحالي: " + aLight.name()); System.out.println("ordinal للضوء الحالي: " + aLight.ordinal()); System.out.println("الضوء الحالي: " + aLight); } } /** * * عرض استعمال Map من نوع Enum، يستخدم Map من نوع Enum بشكل مشابه لـ HashMap، ولكن يجب أن يكون المفتاح نوعاً من أنواع التجميع */ private static void testEnumMap() { // 1. عرض تعريف Map من نوع Enum، يحتاج بناء Map من نوع Enum إلى إدخال معرفات، والمعرفات الافتراضية هي نوع المفتاح EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>; Light.class); currEnumMap.put(الضوء.الاحمر, "الضوء الأحمر"); currEnumMap.put(Light.GREEN, "الضوء الأخضر"); currEnumMap.put(Light.YELLOW, "الضوء الأصفر"); // 2. تجوال الكائن for (Light aLight : Light.values()) { System.out.println("[key=" + aLight.name() + ",value=" + currEnumMap.get(aLight) + "]"); } } /** * * عرض كيفية استعمال EnumSet، EnumSet هي فئة抽象ة، لتحصل على محتويات الأعداد المحددة من نوع معين<BR/> * * يمكن استخدام allOf */ private static void testEnumSet() { EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class); for (Light aLightSetElement : currEnumSet) { System.out.println("البيانات الحالية في EnumSet هي: " + aLightSetElement); } } }
النتيجة التالية:
عرض تجوال النوع المحدد......
اسم الضوء الحالي: RED
الضوء الحالي ordinal: 0
الضوء الحالي: 1
اسم الضوء الحالي: GREEN
الضوء الحالي ordinal: 1
الضوء الحالي: 3
اسم الضوء الحالي: YELLOW
الضوء الحالي ordinal: 2
الضوء الحالي: 2
عرض استعمال EnumMap وتجوالها.....
[key=RED,value=الضوء الأحمر]
[key=GREEN,value=الضوء الأخضر]
[key=YELLOW,value=الضوء الأصفر]
عرض استعمال EnumSet وتجوالها.....
البيانات الحالية في EnumSet هي: 1
البيانات الحالية في EnumSet هي: 3
البيانات الحالية في EnumSet هي: 2
الفرق بين تعريف الأساليب الثابتة العادية وتعريف الأساليب الثابتة باستخدام الأعداد المحددة
المحتوى التالي قد يكون مملاً قليلاً، ولكن يستحق النظر فيه
1. كود:
public class State { public static final int ON = 1; public static final Int OFF= 0; }
ما الذي الخطأ فيه، الجميع يستخدمون ذلك منذ فترة طويلة وليس هناك أي مشكلة
أولاً، إنه ليس آمنًا في نوعه. يجب عليك التأكد من أن القيمة هي int
其次,你还要确保它的范围是0和1
6. بالإضافة إلى ذلك، تأكد من أن نطاقها هو 0 و 1
5. في كثير من الأحيان، عندما تقوم بطباعة، ترى فقط 1 و 0،
4. لا يمكن رؤية الكود من قبل من لا يرى، قم برمي جميع constants public static final القديمة
1. يمكنك إضافة أساليب أخرى، تغطي الأساليب نفسها.
2. يمكنك إنشاء فئة enum، تعامل معها كفئة عادية. باستثناء أنها لا يمكن أن تنقل أي فئة أخرى. (Java مكتسبة من قبل Enum)،
3. يمكن استخدام enum كمعامل لـ switch().
5. لا يمكن استيراد فروع من enum، إذا كنت بحاجة إلى توسيع عناصر enum، قم بإنشاء enum جديد في داخلي لفئة تنفذ هذه الفئة، مما يتيح لك تنظيم العناصر.
6. استخدم EnumSet بدلاً من العلامات. يتطلب enum أن تكون أعضاؤها فريدة، لكن لا يمكن إزالة أو إضافة عناصر إلى enum.
7. مفتاح EnumMap هو enum، والقيمة هي أي Object آخر.
8. يسمح enum للبرمجيات بتسجيل الدخول لتحديد الأساليب. لذا يمكن منح كل نموذج enum سلوكًا مختلفًا.
9. استخدم مسار المسؤولية (Chain of Responsibility) باستخدام enum. هذا يتعلق بنمط المسؤولية في التصميم. لحل المشكلة بطرق متعددة، ثم ربطها معًا. عند وصول طلب، استعرض هذا المسار حتى يتمكن أي حل من التعامل مع الطلب.
10. استخدم ميكانيكية statemachine باستخدام enum.
11. استخدم توزيع multiplexing باستخدام enum.
شكرًا على القراءة، آمل أن تساعدكم، شكرًا لدعمكم لهذا الموقع!