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

السجلات مقابل الطبقات في جافا

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

Records vs Clases en Java

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

ثبات

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

غاية

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

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

على سبيل المثال، إذا كان لديك فئة شخص تحتوي على سمتين هما الاسم واسم العائلة، فيمكنك كتابتها على النحو التالي:

public class Person {

    private final String name;
    private final String lastName;

    public Person(String name, String lastName) {
        this.name = name;
        this.lastName = lastName;
    }

    public String getName() {
        return name;
    }

    public String getLastName() {
        return lastName;
    }

    @Override
    public String toString() {
        return "Person{"   "name='"   name   '\''  
                ", lastName='"   lastName   '\''  
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person person)) return false;
        return Objects.equals(getName(), person.getName()) && Objects.equals(getLastName(), person.getLastName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName(), getLastName());
    }
}

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

بهذه الطريقة يمكن إعادة كتابة فئة الشخص كسجل على النحو التالي:

شخص السجل العام (اسم السلسلة، اسم العائلة للسلسلة) { }
public record Person(String name, String lastName) { }
يؤدي هذا تلقائيًا إلى إنشاء أساليب يساوي ورمز التجزئة وtoString، بالإضافة إلى أساليب getter لكل من السمات.

ما هي الاختلافات بين السجل والفئة؟

  • الثبات: السجلات غير قابلة للتغيير، أي أنه بمجرد إنشاء كائن من النوع السجل، لا يمكن تعديل سماته. بدلاً من ذلك، قد تكون أو لا تكون الفئة غير قابلة للتغيير، اعتمادًا على كيفية تنفيذها.
  • الطرق المولدة: تقوم السجلات تلقائيًا بإنشاء طرق يساوي ورمز التجزئة وtoString، بالإضافة إلى طرق getter لكل من السمات. ومع ذلك، في الفصول الدراسية، يجب تنفيذ هذه الأساليب يدويًا أو بمساعدة IDE.
  • الاستخدام في OOP: لا يمكن أن ترث السجلات من فئات أخرى، ولا يمكن توسيعها بواسطة فئات أخرى، ولكن يمكنها تنفيذ واجهات. من ناحية أخرى، يمكن أن ترث الفئات من الآخرين، ويمكن توسيعها، وبشكل عام تعتبر مثالية لتغطية مفاهيم البرمجة الشيئية.
  • بناء الجملة: بناء جملة السجل أبسط من بناء جملة الفصل، حيث يمكن تعريفه في سطر واحد، بينما يتطلب الفصل عدة أسطر من التعليمات البرمجية.
  • الغرض: إن السجلات هي بنية تشبه DTO (كائن نقل البيانات)، أي فئة تساعد في نموذج البيانات غير القابلة للتغيير، من جانبها فئة هو هيكل أكثر عمومية يمكن أن يكون له سلوك وحالة.
متى تستخدم السجل ومتى تستخدم الفصل؟

إذا كان المطلوب هو بنية بيانات غير قابلة للتغيير لتخزين البيانات ولا يلزم إجراء أي تعديلات على السمات (يُنظر إليها ببساطة على أنها كائن يحمل المعلومات). من ناحية أخرى، إذا كنت بحاجة إلى بنية أكثر عمومية لها منطق فريد وأساليب محددة، أو نهج لنموذج موجه للكائنات، أو تطبيق أنماط التصميم، أو العمل مع JPA أو Hibernate، وما إلى ذلك، فيجب عليك استخدام فئة .

إضافي: سجل باستخدام سمات قابلة للتغيير

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


الحزمة org.jordi.example; منتج السجل العام (اسم السلسلة، السعر المزدوج) { }
package org.jordi.example;

public record Product(String name, double price) { }
الحزمة org.jordi.example; import java.util.ArrayList; import java.util.List; عربة السجل العامة (قائمة المنتجات> المنتج) { العربة العامة () { this(new ArrayList()); } كثافة العمليات العامة getQuantity() { إرجاع this.products.size(); } getTotal مزدوج عام () { إرجاع this.products.stream().mapToDouble(Product::price).sum(); } }
public record Person(String name, String lastName) { }
المشكلة في هذه الحالة هي أن كل من

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

الحزمة org.jordi.example; الطبقة العامة الرئيسية { public static void main(String[] args) { ماء المنتج = منتج جديد("ماء"، 15); حليب المنتج = منتج جديد ("حليب"، 22)؛ عربة التسوق = عربة التسوق الجديدة () ؛ cart.products().add(water); cart.products().add(milk); System.out.println("السعر:" cart.getTotal()); cart.products().clear(); System.out.println("الكمية:" cart.getQuantity()); System.out.println("السعر:" cart.getTotal()); } }
public record Person(String name, String lastName) { }
يتم تجميع الكود أعلاه دون مشاكل، حيث يتم تعديل محتوى القائمة فقط، ولكن لا يتم تعديل سمة المنتجات نفسها. هذا مجرد مثال لحالة معينة، وهو على الأرجح ليس ضروريًا، ولكن من الجيد معرفة أنه يمكن القيام بذلك.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/asjordi/records-vs-clases-en-java-1bb6?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3