71. ماذا يحدث إذا لم نقم بتجاوز طريقة toString() الخاصة بـ Enum؟
لنفترض أن لدينا التعداد التالي :public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
لنعرض الطالب في وحدة التحكم عن طريق استدعاء toString() عليه :
System.out.println(Role.STUDENT.toString());
النتيجة في وحدة التحكم:
72. هل من الممكن تحديد مُنشئ داخل التعداد؟
نعم بالتأكيد. من خلال المنشئ يتم تعيين قيم متغيرات التعداد الداخلي. على سبيل المثال، دعونا نضيف حقلين إلى التعداد السابق - ageFrom و ageTo - للإشارة إلى الفئة العمرية لكل دور:public enum Role {
STUDENT(5,18),
TEACHER(20,60),
DIRECTOR(40,70),
SECURITY_GUARD(18,50);
int ageFrom;
int ageTo;
Role(int ageFrom, int ageTo) {
this.ageFrom = ageFrom;
this.ageTo = ageTo;
}
}
73. ما الفرق بين == و يساوي ()؟
هذا أحد الأسئلة الأكثر شيوعًا لمقابلة مطوري Java. لنبدأ بحقيقة أننا عندما نقارن قيمًا بسيطة ( int , char , double ...) فإننا نفعل ذلك باستخدام == ، نظرًا لأن المتغيرات تحتوي على قيم محددة ويمكننا مقارنتها. والمتغيرات البدائية ليست كائنات كاملة - فهي لا ترث من الكائن وليس لديها طريقة يساوي () . عندما نتحدث عن مقارنة المتغيرات التي تشير إلى كائنات، فإن == ستقارن فقط قيمة المراجع - سواء كانت تشير إلى نفس الكائن أم لا. وحتى لو كان أحد الكائنات مطابقًا لكائن آخر، فإن المقارنة عبر == ستعطي نتيجة سلبية ( خطأ )، لأن هذا كائن مختلف. كما تفهم، يتم استخدام طريقة يساوي () لمقارنة المتغيرات المرجعية . هذه إحدى الطرق القياسية لفئة الكائن ، وهي ضرورية لإجراء مقارنة كاملة للكائنات. لكن الأمر يستحق التوضيح على الفور: لكي تعمل هذه الطريقة بشكل صحيح، يجب إعادة تعريفها من خلال الكتابة بالضبط عن كيفية مقارنة كائنات هذه الفئة. ما لم تقم بتجاوز الطريقة، فستقوم افتراضيًا بمقارنة الكائنات حسب == . في IntelliJ IDEA ، يمكنك تجاوزه تلقائيًا (باستخدام أدوات IDEA) -> alt + Insert ، في النافذة التي تظهر، حدد equal() و hashCode() -> حدد حقول الفصل التي يجب أن تشارك -> وفويلا، التنفيذ التلقائي لـ تم الانتهاء من الأساليب. فيما يلي مثال على الشكل الذي ستبدو عليه طريقة التساوي التي تم إنشاؤها تلقائيًا لفئة Cat البسيطة التي تحتوي على حقلين - int age و String name :@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || this.getClass() != o.getClass()) return false;
final Cat cat = (Cat) o;
return this.age == cat.age &&
Objects.equals(this.name, cat.name);
}
إذا تحدثنا عن الفرق بين == و يساوي بالنسبة للتعدادات ، فلا يوجد الكثير منه. بعد كل شيء، يقوم التعداد بتخزين الثوابت، وحتى عند مقارنة القيم المتشابهة باستخدام == ، سنحصل على true ، نظرًا لأن المراجع ستكون دائمًا لنفس الكائنات. حسنًا، عند استخدام يساوي، سنعمل أيضًا على حل الوظيفة بشكل صحيح، خاصة إذا ذهبت إلى نص طريقة يساوي للتعداد ، سترى أنه في فئة التعداد يكون تنفيذ الطريقة كما يلي : في الداخل - المقارنة القديمة الجيدة بالرجوع إليها! لتلخيص: بالنسبة للتعداد ، المقارنة بين == و يساوي صحيحة.
74. ماذا تفعل الطريقة الترتيبية () في التعداد؟
عند استدعاء التابع int ordinal() على عنصر التعداد ، سنحصل على الرقم الترتيبي من الصفر لهذه القيمة في سلسلة التعدادات العامة. لنستخدم هذه الطريقة على عنصر واحد من التعداد السابق الذي تمت مناقشته - الدور :System.out.println(Role.DIRECTOR.ordinal());
وفقًا لذلك، ستعرض وحدة التحكم ما يلي:
75. هل من الممكن استخدام Enum مع TreeSet أو TreeMap في Java؟
يعد استخدام أنواع التعداد في TreeSet و TreeMap أمرًا مقبولًا. ويمكننا أن نكتب:TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
وستعرض وحدة التحكم:
76. كيف ترتبط الأساليب الترتيبية () والمقارنة مع () في التعداد؟
كما ذكرنا سابقًا، تقوم الدالة ordinal() بإرجاع الرقم الترتيبي لقيمة ما في قائمة التعداد العامة. أيضًا، في تحليل السؤال السابق، رأيت أن عناصر التعدادات، مرة واحدة، على سبيل المثال، في TreeSet (مجموعة مرتبة) تأخذ الترتيب الذي تم الإعلان عنه في enum . وكما نعلم، تقوم TreeSet و TreeMap بفرز العناصر عن طريق استدعاء طريقة CompareTo() الخاصة بالواجهة القابلة للمقارنة . من هذا يمكننا أن نفترض أن فئة Enum تطبق الواجهة القابلة للمقارنة ، ويتم تنفيذها في طريقة CompareTo() ، والتي يتم من خلالها استخدام ordinal() لتعيين ترتيب الفرز. بعد الدخول إلى فئة Enum ، نرى تأكيدًا لذلك: ونص الطريقة نفسها: لا يتم استدعاء الطريقة الترتيبية () هنا. بدلا من ذلك، يتم استخدام المتغير الترتيبي - الرقم الترتيبي للعنصر في التعداد. الطريقة الترتيبية () نفسها ليست أكثر من مجرد مُحضر للمتغير الترتيبي .77. اكتب مثالاً EnumM
في الأسئلة التي تمت مناقشتها أعلاه، قدمت بالفعل أمثلة على التعدادات ولا أرى فائدة من تكرار الكود (على سبيل المثال، السؤال رقم 72 حول المُنشئ في التعداد).78. هل من الممكن استخدام التعداد في حالة التبديل؟
إنه ممكن وضروري! بالنظر إلى ممارستي السابقة، لاحظت أن أحد أكثر الأماكن شيوعًا لاستخدام التعداد هو البناء المنطقي مثل Switch . في هذه الحالة، يمكنك توفير جميع الأشكال الممكنة للحالة ، وبعد كتابة المنطق لجميع قيم التعداد - وقد لا يكون استخدام العامل الافتراضي ضروريًا! بعد كل شيء، إذا كنت تستخدم سلسلة أو قيمة رقمية، على سبيل المثال، من النوع int ، فقد تتلقى قيمة غير متوقعة، وهذا بدوره مستحيل باستخدام التعداد . كيف سيبدو المفتاح بالنسبة للمثال الذي تمت مناقشته سابقًا:public void doSomething(Role role) {
switch (role) {
case STUDENT:
// некая логика для STUDENT
break;
case TEACHER:
// некая логика для TEACHER
break;
case DIRECTOR:
// некая логика для DIRECTOR
break;
case SECURITY_GUARD:
// некая логика для SECURITY_GUARD
break;
}
}
79. كيفية الحصول على جميع القيم المتاحة في مثيل التعداد؟
إذا كنت بحاجة إلى الحصول على جميع مثيلات التعداد، فهناك طريقة values() التي تُرجع مصفوفة من جميع القيم المتاحة لتعداد معين بالترتيب الطبيعي (بالترتيب الذي تم تحديدها به في التعداد ). مثال:Role[] roles = Role.values();
for (Role role : roles) {
System.out.println(role);
}
ستعرض وحدة التحكم الإخراج التالي:
دفق API
80.ما هو الدفق في جافا؟
تعد Java Stream طريقة جديدة نسبيًا للتفاعل مع تدفق البيانات، والتي بدورها تسمح لك بمعالجة البيانات الكبيرة بشكل أكثر سهولة وإحكامًا، بالإضافة إلى موازنة معالجة البيانات بين عدد معين من سلاسل العمليات، مما يمكن أن يوفر تعزيزًا للأداء في الاستخدام. وظائف. لا يمكن مناقشة هذا الموضوع بشكل أعمق باختصار، لذلك سأترك هنا رابطًا لمقال يمكن أن يساعدك في الغوص في هذا الموضوع.81. ما هي الخصائص الرئيسية للمعاملات؟
الموضوع يسمى Stream API، لكن السؤال يتعلق بالمعاملة. حسنًا... أولاً، دعونا نتعرف على ماهية المعاملة. المعاملة عبارة عن مجموعة من عمليات قاعدة البيانات المتسلسلة التي تمثل وحدة منطقية للعمل مع البيانات. يمكن إكمال المعاملة إما بشكل كامل وبنجاح، مع الحفاظ على سلامة البيانات وبشكل مستقل عن المعاملات الأخرى التي تجري بالتوازي، أو لا يمكن إكمالها على الإطلاق، وفي هذه الحالة ليس لها أي تأثير. لذلك، المعاملات لها أربع خصائص رئيسية، والتي تسمى ACID للاختصار . دعونا نلقي نظرة على كيفية تمثيل كل حرف من هذا الاختصار: أ - الذرية - الذرية - تضمن هذه الخاصية عدم تسجيل أي معاملة جزئيًا في النظام. إما سيتم تنفيذ كافة العمليات الفرعية، أو لن يتم تنفيذ أي منها ( الكل أو لا شيء ). ج - الاتساق - الاتساق هو خاصية تضمن أن كل معاملة ناجحة تسجل النتائج الصحيحة فقط. أي أن هذا ضمان أنه في حالة نجاح المعاملة سيتم استيفاء كافة القواعد والقيود التي يفرضها النظام على بيانات محددة، وإلا فلن تتم المعاملة وتعود البيانات الموجودة في النظام إلى سابق عهدها ولاية. I - العزلة - العزلة هي خاصية تنص على أنه أثناء تنفيذ المعاملة، يجب ألا تؤثر المعاملات الموازية على نتيجتها. هذه الخاصية كثيفة الاستخدام للموارد، لذلك يتم تنفيذها عادةً جزئيًا من خلال السماح بمستويات معينة من العزل التي تحل مشكلات عزل معينة. سنناقش هذا بمزيد من التفصيل في السؤال التالي. د - المتانة - تضمن هذه الخاصية أنه إذا تلقى المستخدم تأكيدًا من النظام بإتمام المعاملة، فيمكنه التأكد من أن التغييرات التي أجراها لن يتم إلغاؤها بسبب بعض الفشل. أي أنه يمكنك التأكد من أن أي فشل في نظام التشغيل لن يفعل أي شيء لبياناتك إذا كنت قد تلقيت بالفعل تأكيدًا بإتمام معاملتك بنجاح.82. ما هي مستويات عزل المعاملة؟
كما قلت سابقًا، يعد توفير عزل ACID عملية كثيفة الاستخدام للموارد. لذلك، هذه الخاصية راضية جزئيا. هناك مستويات مختلفة من العزلة، وكلما ارتفع المستوى، زاد التأثير على الإنتاجية. قبل الانتقال إلى مستويات عزل المعاملات، نحتاج إلى إلقاء نظرة على المشاكل المختلفة المتعلقة بعزل المعاملات غير الكافي :-
القراءة الوهمية - عندما يتم استدعاء نفس العينة (نفس الاستعلام) بشكل متكرر داخل نفس المعاملة، تختلف البيانات المستلمة، والذي يحدث بسبب إدراج البيانات بواسطة معاملة أخرى؛
-
القراءة غير المتكررة - عندما يتم استدعاء نفس العينة (نفس الاستعلام) بشكل متكرر داخل نفس المعاملة، تختلف البيانات المستلمة، والذي يحدث بسبب التغييرات (التحديث) وحذف البيانات من خلال معاملة أخرى؛
-
القراءة القذرة - عملية قراءة البيانات المضافة أو المتغيرة بواسطة معاملة لم يتم تأكيدها (تراجعها) لاحقًا، أي. قراءة البيانات غير الصالحة؛
-
التحديث المفقود - عندما تقوم معاملات مختلفة بتغيير نفس البيانات في نفس الوقت، يتم فقدان جميع التغييرات باستثناء التغييرات الأخيرة (تذكرنا بمشكلة "حالة السباق" في بيئة متعددة الخيوط).
مستوى العزلة | القراءة الوهمية | قراءة غير متكررة | القراءة القذرة | التحديث المفقود |
---|---|---|---|---|
قابل للتسلسل | + | + | + | + |
قراءة متكررة | - | + | + | + |
قراءة ملتزمة | - | - | + | + |
قراءة غير ملتزم بها | - | - | - | + |
لا أحد | - | - | - | - |
83. ما هو الفرق بين البيان والبيان المعد؟
وهنا لا يوجد انتقال سلس للغاية إلى ميزات تقنية JDBC . لذا، أولاً، دعونا نتعرف على ماهية البيان في الواقع . هذا هو الكائن الذي يتم استخدامه لإنشاء استعلامات SQL. يستخدم JDBC ثلاثة أنواع - البيان ، و PreparedStatement ، و CallableStatement . لن ننظر إلى CallableStatement اليوم: فلنتحدث عن الفرق بين البيان و PreparedStatement .-
يتم استخدام العبارة لتنفيذ استعلامات SQL بسيطة بدون معلمات واردة ومدرجة ديناميكيًا. يتم استخدام PreviewStatement مع القدرة على إدراج معلمات الإدخال ديناميكيًا.
-
لتعيين المعلمات في PreparationStatement، تتم كتابة معلمات الإدخال في الطلب كعلامات استفهام، بحيث يمكن بعد ذلك إدراج قيمة بدلاً من ذلك باستخدام أدوات ضبط مختلفة، مثل setDouble() و setFloat() و setInt() و setTime() ... . ونتيجة لذلك، لن تتمكن من إدراج نوع خاطئ من البيانات في استعلامك.
-
يتم " ترجمة PreadStatement " ويستخدم التخزين المؤقت، لذلك يمكن أن يكون تنفيذه أسرع قليلاً من الاستعلام من كائنات البيان . ونتيجة لذلك، تتم كتابة استعلامات SQL التي يتم تنفيذها بشكل متكرر ككائنات PreparationStatement لتحسين الأداء .
-
البيان عرضة لحقن SQL، بينما يمنعها PreviewdStatement . اقرأ المزيد حول التخلص من عمليات حقن SQL وأفضل الممارسات الأخرى في أمان Java في هذه المقالة .
GO TO FULL VERSION