0%
السجلات (Records): فئات بيانات دون شيفرة مولَّدة

السجلات (Records)

استبدال مئة سطر مولَّدة بتصريح من سطر واحد، ومعرفة متى يجب الامتناع عن ذلك.

10-15 دقيقة

السجلات (Records): فئات بيانات دون شيفرة مولَّدة

افتح أي مشروع Java 8 وابحث عن فئة Point أو Adresse أو LigneCommande. ستجد ثلاثة حقول مفيدة مدفونة في مئة وعشرين سطرًا لم يكتبها أحد يدويًا: مُنشئ، وستّ دوال وصول، ودالة equals ولّدتها بيئة التطوير، ودالة hashCode مصاحبة لها، ودالة toString. هذه الشيفرة لا تعبّر عن شيء. ومع ذلك فهي تُحفظ في نظام التحكم بالإصدارات، وتُراجَع في مراجعة الشيفرة، والأسوأ أنها تكذب بمجرد إضافة حقل رابع دون إعادة توليد equals. والخلل الناتج، أي كائنان متطابقان تعاملهما HashMap على أنهما مختلفان، من أطول الأخطاء تشخيصًا، لأن الشيفرة المعيبة تبدو سليمة.

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

قبل: الفئة الحاملة للبيانات

// Java 8
public final class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() { return x; }
    public int getY() { return y; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Point autre = (Point) o;
        return x == autre.x && y == autre.y;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y);
    }

    @Override
    public String toString() {
        return "Point{x=" + x + ", y=" + y + '}';
    }
}

التعليقات

التعليقات مدعومة عبر GitHub Discussions

سجّل الدخول باستخدام GitHub للمشاركة في النقاش

تم نسخ الرابط!