نمط Builder مع Fluent API
أنشئ الكائنات المعقدة خطوةً بخطوة باستخدام builder انسيابي لتجنب المنشئات المتداخلة
نمط Builder مع Fluent API درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
مشكلة المُنشئات المتداخلة
عندما تحتوي فئة على كثير من المعاملات الاختيارية، تتكاثر المُنشئات: مُنشئ بمعاملين، ثم ثلاثة، ثم أربعة... يحل نمط Builder هذه المشكلة من خلال واجهة API مرنة للتهيئة خطوةً بخطوة.
// Without builder — hard to read:
Pizza p = new Pizza("large", "thin", true, false, true, false, "mozzarella");البنية الأساسية لـ Builder
أنشئ فئة Builder متداخلة static. وتحتوي الفئة الخارجية على مُنشئ خاص يتلقى builder. وتعيد كل أداة ضبط في builder القيمة this لإتاحة التسلسل المرن للاستدعاءات.
public final class Pizza {
private final String size, crustType, cheese;
private final boolean extraSauce, pepperoni;
private Pizza(Builder b) {
this.size = b.size; this.crustType = b.crustType;
this.cheese = b.cheese; this.extraSauce = b.extraSauce;
this.pepperoni = b.pepperoni;
}
public static class Builder {
private final String size;
private String crustType = "regular", cheese = "mozzarella";
private boolean extraSauce, pepperoni;
public Builder(String size) { this.size = size; }
public Builder crustType(String c) { this.crustType = c; return this; }
public Builder cheese(String c) { this.cheese = c; return this; }
public Builder extraSauce() { this.extraSauce = true; return this; }
public Builder pepperoni() { this.pepperoni = true; return this; }
public Pizza build() { return new Pizza(this); }
}
}استخدام واجهة API المرنة
تُقرأ أوامر builder كما لو كانت جملة. توضع المعاملات المطلوبة في المُنشئ، بينما تُمرّر المعاملات الاختيارية عبر استدعاءات الطرق. وينتج الاستدعاء النهائي build() كائنًا غير قابل للتغيير.
Pizza p = new Pizza.Builder("large")
.crustType("thin")
.extraSauce()
.pepperoni()
.build();
System.out.println(p);التحقق داخل build()
أضف منطق التحقق داخل build() قبل إنشاء الكائن. وألقِ IllegalStateException أو IllegalArgumentException عند وجود تركيبات غير صالحة.
public Pizza build() {
if (size == null || size.isBlank())
throw new IllegalArgumentException("Size required");
if (extraSauce && crustType.equals("stuffed"))
throw new IllegalStateException("No extra sauce on stuffed crust");
return new Pizza(this);
}Builder للكائنات غير القابلة للتغيير
بما أن الفئة الخارجية تُنشأ من builder دفعةً واحدة، يمكن أن تكون جميع الحقول final، مما يجعل الكائن الناتج غير قابل للتغيير وآمنًا تمامًا في بيئات التنفيذ متعددة الخيوط.
public final class Address {
private final String street, city, country;
private final String postalCode;
private Address(Builder b) { ... } // all finals
// no setters — immutable!
}Builder عام مع نوع الذات
في تسلسلات التوريث، استخدم معامل نوع عام تكراريًا (SELF extends Builder<SELF>) لكي تعيد builders الخاصة بالفئات الفرعية نوع الفئة الفرعية من الطرق المتسلسلة.
public abstract static class Builder<SELF extends Builder<SELF>> {
String name;
@SuppressWarnings("unchecked")
public SELF name(String n) { this.name = n; return (SELF) this; }
public abstract Vehicle build();
}Lombok @Builder
ينشئ @Builder في Lombok البنية التحتية الكاملة لـ builder أثناء الترجمة. استخدم @Builder.Default للقيم الافتراضية للحقول، و@Singular للمجموعات.
@Builder
public class Report {
private final String title;
@Builder.Default private final int pageCount = 1;
@Singular private final List<String> authors;
}
// Usage:
Report r = Report.builder().title("Q4").author("Alice").author("Bob").build();Builder في JDK
تستخدم فئات كثيرة في JDK واجهات API بأسلوب builder، مثل StringBuilder وHttpRequest.newBuilder() وProcessBuilder وStream.Builder. تعرّف على هذا النمط.
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/users"))
.header("Accept", "application/json")
.GET()
.build();Builder مقابل Factory
استخدم Builder عندما يتطلب الكائن معاملات كثيرة وتهيئةً خطوةً بخطوة. واستخدم Factory عندما تكون جميع المتغيرات بسيطة ويمكن تنفيذ الإنشاء في استدعاء واحد.
Builder لبيانات الاختبار
تتألق builders في الاختبارات: أنشئ builder أساسيًا في أداة مساعدة، ثم غيّر الحقول المتعلقة بكل حالة اختبار فقط، مع الحفاظ على جفاف الاختبارات وسهولة قراءتها.
User defaultUser() { return new User.Builder("test@example.com").name("Test User").build(); }
User adminUser() { return new User.Builder("admin@example.com").name("Admin").role(ADMIN).build(); }الأمان في بيئات التنفيذ متعددة الخيوط
إن builder نفسه غير آمن للاستخدام مع عدة خيوط، لذلك لا تشارك Builder بين الخيوط. أما المنتج المبني منه فيمكن أن يكون غير قابل للتغيير وآمنًا مع عدة خيوط إذا كانت جميع الحقول نهائية ولم تتم مشاركة كائنات قابلة للتغيير.
تحقق سريع
ما الذي يجعل طريقة builder «مرنة»؟
مراجعة
يحل Builder مشكلة المُنشئات المتداخلة. استخدم فئة Builder متداخلة static، وأعد this من كل أداة ضبط، ونفّذ التحقق في build()، ثم أنتج كائنًا غير قابل للتغيير. ويؤتمت @Builder في Lombok الشيفرة المتكررة.
الأسئلة الشائعة
هل درس «نمط Builder مع Fluent API» مجاني؟
نعم — نص درس «نمط Builder مع Fluent API» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «نمط Builder مع Fluent API»؟
أنشئ الكائنات المعقدة خطوةً بخطوة باستخدام builder انسيابي لتجنب المنشئات المتداخلة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «نمط Builder مع Fluent API»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Singleton: تطبيقات آمنة للخيوط
- نمط Factory Method
- Abstract Factory لعائلات المنتجات
- نمط Builder مع Fluent API