0Pricing
Java Academy · درس

مراجع المنشئات

استخدم ClassName::new لإنشاء مثيلات عبر الواجهات الوظيفية مثل Supplier وFunction

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

ما مراجع المُنشئات؟

يستخدم مرجع المُنشئ البنية ClassName::new لإنشاء كائنات عبر واجهة وظيفية. وتطابق معاملات الواجهة الوظيفية معاملات المُنشئ.

import java.util.function.*;

class Person {
    String name;
    Person(String name) { this.name = name; }
    public String toString() { return "Person(" + name + ")"; }
}

// Function<String, Person> — calls Person(String)
Function<String, Person> factory = Person::new;
Person p = factory.apply("Alice");
System.out.println(p); // Person(Alice)

المُنشئ بلا معاملات بوصفه Supplier

يطابق المُنشئ الذي لا يأخذ معاملات Supplier<T>:

class Counter {
    int count = 0;
    void inc() { count++; }
}

Supplier<Counter> newCounter = Counter::new;
Counter c1 = newCounter.get();
Counter c2 = newCounter.get(); // independent instances
c1.inc();
System.out.println(c1.count); // 1
System.out.println(c2.count); // 0

المُنشئ ذو المعاملين بوصفه BiFunction

تطابق المُنشئات التي لها معاملان BiFunction<T,U,R>:

record Point(int x, int y) {}

BiFunction<Integer, Integer, Point> makePoint = Point::new;
Point p = makePoint.apply(3, 4);
System.out.println(p); // Point[x=3, y=4]

مرجع المُنشئ في Stream.map

حوّل السلاسل النصية إلى كائنات باستخدام مرجع مُنشئ:

import java.util.*;
import java.util.stream.*;

List<String> names = List.of("Alice","Bob","Carol");

List<Person> people = names.stream()
    .map(Person::new)  // calls new Person(name) for each
    .collect(Collectors.toList());

people.forEach(System.out::println);
// Person(Alice)
// Person(Bob)
// Person(Carol)

مرجع مُنشئ المصفوفة

أنشئ المصفوفات ديناميكيًا باستخدام Type[]::new. ويُستخدم ذلك بواسطة Stream.toArray():

import java.util.stream.*;

String[] arr = Stream.of("a","b","c")
    .toArray(String[]::new);

for (String s : arr) System.out.print(s + " ");
// a b c

int[] sizes = {3, 5, 2};
String[][] matrix = Arrays.stream(sizes)
    .mapToObj(String[]::new)
    .toArray(String[][]::new);

نمط واجهة المصنع

عرّف واجهة وظيفية مخصصة للمصانع، ثم استخدم مراجع المُنشئات:

@FunctionalInterface
interface Factory<T> {
    T create(String config);
}

class DBConnection {
    String url;
    DBConnection(String url) { this.url = url; }
    public String toString() { return "DB(" + url + ")"; }
}

Factory<DBConnection> dbFactory = DBConnection::new;
DBConnection conn = dbFactory.create("jdbc:postgresql://localhost/mydb");
System.out.println(conn);

حقن التبعيات باستخدام مراجع المُنشئات

تستخدم الأطر البرمجية غالبًا مصانع وظيفية للإنشاء الكسول. وتجعل مراجع المُنشئات هذا النمط واضحًا:

import java.util.function.*;

class ServiceLocator {
    private final Map<String, Supplier<?>> registry = new HashMap<>();
    
    <T> void register(String name, Supplier<T> factory) {
        registry.put(name, factory);
    }
    
    @SuppressWarnings("unchecked")
    <T> T get(String name) { return (T) registry.get(name).get(); }
}

ServiceLocator loc = new ServiceLocator();
loc.register("counter", Counter::new);
Counter c = loc.get("counter");

الاختيار بين lambda ومرجع المُنشئ

استخدم مرجع مُنشئ عندما يكون جسم lambda مجرد new Type(args):

// Lambda:
Function<String, Person> f1 = name -> new Person(name);

// Constructor reference (preferred):
Function<String, Person> f2 = Person::new;

// When you need extra logic, stick with lambda:
Function<String, Person> f3 = name -> new Person(name.trim().toLowerCase());

الأنواع العامة ومراجع المُنشئات

تعمل الفئات العامة أيضًا — إذ يُستنتج النوع من سياق الواجهة الوظيفية:

import java.util.*;
import java.util.function.*;

// ArrayList::new matches Supplier<ArrayList<String>>
Supplier<List<String>> listFactory = ArrayList::new;
List<String> l1 = listFactory.get();
List<String> l2 = listFactory.get(); // independent lists
l1.add("hello");
System.out.println(l2.size()); // 0

مجمّعات Stream باستخدام مراجع المُنشئات

استخدم مراجع المُنشئات في المجمعات لإنشاء حاويات نتائج مخصصة:

import java.util.stream.*;

// Collect into a LinkedList using a constructor reference supplier
LinkedList<String> linked = Stream.of("a","b","c")
    .collect(Collectors.toCollection(LinkedList::new));
System.out.println(linked.getFirst()); // a

الأنواع البدائية والتغليف التلقائي

تتعامل مراجع المُنشئات لأنواع التغليف مع التغليف التلقائي:

// Integer::new is deprecated in Java 9+, but illustrates the concept
// Use Integer.valueOf or just autoboxing in modern Java
Function<String, Integer> intParser = Integer::parseInt; // static method ref
System.out.println(intParser.apply("42")); // 42

تحقق سريع

ما الواجهة الوظيفية التي يطابقها مرجع مُنشئ بلا معاملات مثل ArrayList::new؟

مراجعة: مراجع المُنشئات

أهم النقاط:

  • البنية: ClassName::new — تفوّض إلى المُنشئ المطابق
  • بلا معاملات → Supplier<T>؛ بمعامل واحد → Function<T,R>؛ بمعاملين → BiFunction
  • مُنشئ المصفوفة: Type[]::new — يُستخدم مع Stream.toArray()
  • أوضح من lambda عندما يكون جسم lambda مجرد 'new Type(args)'
  • استخدم Collectors.toCollection(LinkedList::new) للحصول على نتائج مجموعات ذات نوع محدد

الأسئلة الشائعة

هل درس «مراجع المنشئات» مجاني؟

نعم — نص درس «مراجع المنشئات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «مراجع المنشئات»؟

استخدم ClassName::new لإنشاء مثيلات عبر الواجهات الوظيفية مثل Supplier وFunction تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «مراجع المنشئات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مراجع الأساليب الثابتة
  2. مراجع أساليب الكائن في مثيل محدد
  3. مراجع أساليب الكائنات التعسفية
  4. مراجع المنشئات
← العودة إلى Java Academy