"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > العناية بنقل النوع في جافا

العناية بنقل النوع في جافا

تم النشر بتاريخ 2024-11-08
تصفح:429

جافا هي لغة مكتوبة بقوة، ولكن لا يزال من الممكن نقل القيم بين المتغيرات البدائية من أنواع مختلفة. على سبيل المثال، يمكنني تعيين قيمة int إلى قيمة مزدوجة دون أي مشاكل، طالما أن سعة التخزين للنوع الذي يستقبل القيمة يمكنها التعامل معها.

انظر أدناه حجم كل نوع بدائي:

Cuidados com transferência de tipos em Java

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

ولكن ماذا لو أردت نقل القيمة إلى نوع بسعة تخزين أقل؟ مترجم Java لا يحب هذا، لكنه سيسمح به إذا قمت بإدراجه، كما في المثال أدناه.

double decimal = 65.9;
int i = (int) decimal; //aqui ele perde a casa decimal e vira 65
char c = (char) i; //aqui ele vira a letra A (que corresponde a 65)

إذا تجاوز حجم القيمة التي ستنتقل إلى النوع الجديد حدود هذا النوع، فيمكن أن يحدث شيء أكثر دراماتيكية. يتناسب int i = 10 مع متغير بايت، لأنه يحتوي على 8 بتات في نطاق من -128 إلى 127. ومع ذلك، ماذا لو أردت وضع int i = 128 في متغير من النوع بايت... سيكون هناك فقدان المعلومات .

public class Main
{
    public static void main(String[] args) {
        int i = 128;
        byte b = (byte) i;

        System.out.println(b); // o valor de b agora é -128 :S
    }
}

التعبئة التلقائية

في المنشور الأخير [اقرأه هنا]، تحدثت قليلاً عن فئات الغلاف. على سبيل المثال، كتبت Integer.parse(i) = تخيل أنني من النوع
كثافة العمليات البدائية.

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

Character ch = 'a';
Integer i = 10;

لاحظ أن هذا نهج أكثر مباشرة. ما عليك سوى تعيين القيمة مرة واحدة.

لعمل العكس وإرجاع البيانات كنوع بدائي، يمكنك القيام بـ "unboxing" باستخدام طريقة valueOf:

Integer i = 10;
int j = Integer.valueOf(i);

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

قد تبدو النسخة المجمعة للبدائية تشبهها كثيرًا للوهلة الأولى، لكن JVM لا يتعامل مع الكائن والبدائي بنفس الطريقة، لا تنس. تذكر أن العناصر الأولية تذهب إلى المكدس وتنتقل إلى الكومة [تذكر هنا].

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

ولكن هناك حالات يكون فيها استخدام الغلاف ضروريًا. على سبيل المثال، عندما تريد العمل مع فئة ArrayList. فهو يقبل فقط الكائنات كمعلمات، وليس القيم البدائية.

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

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

وردت هذه الحالة في كتاب "جافا الفعالة" للكاتب جوشوا بلوخ.

public class SetListTest {
    public static void main(String[] args) {
        Set set = new TreeSet();
        List list = new ArrayList();

        for (int i = -3; i 



في هذا البرنامج، كان الهدف هو إضافة قيم عددية من -3 إلى 2 [-3، -2، -1، 0، 1، 2] إلى مجموعة وقائمة. ثم قم بحذف القيم الموجبة [0، 1، 2]. ولكن، إذا قمت بتشغيل هذا الرمز، ستلاحظ أن المجموعة والقائمة لم تقدم نفس النتيجة. تقوم المجموعة بإرجاع [-3، -2، -1]، كما هو متوقع. ترجع القائمة [-2، 0، 2].

يحدث هذا لأن استدعاء طريقة الإزالة (i) المضمنة لفئة القائمة يعامل i كنوع بدائي int، ولا شيء غير ذلك. تقوم الطريقة بدورها بإزالة العناصر الموجودة في الموضع i.

يستدعي استدعاء طريقة الإزالة (i) لفئة Set تحميلًا زائدًا يستقبل كائنًا صحيحًا كمعلمة، ويحول تلقائيًا i، الذي كان في الأصل int، إلى عدد صحيح. سلوك هذه الطريقة، بدوره، يستثني من المجموعة العناصر التي لها قيمة تساوي i (وليس فهرسًا يساوي i) - لاحظ أن النوع المتوقع لكل من المجموعة والقائمة كان عددًا صحيحًا. (تعيين مجموعة / قائمة القائمة). ولهذا السبب فإن التحميل الزائد الذي تم اختياره لطريقة الإزالة، للفئة Set، حوله إلى عدد صحيح.

بينما يكون سلوك الإزالة في القائمة هو الحذف حسب الفهرس، فإن الإزالة في المجموعة هي الحذف حسب القيمة. كل ذلك بسبب التحميل الزائد على عملية الإزالة التي تستقبل عددًا صحيحًا.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/anaccortez/cuidados-com-transferencia-de-tipos-em-java-10he?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3