فئات الأدوات وأساليب المصنع الثابتة
صمّم فئات أدوات لا يمكن إنشاء كائنات منها، ووفّر أساليب مصنع ثابتة بديلة عن المنشئات
فئات الأدوات وأساليب المصنع الثابتة درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
أصناف الأدوات وأساليب المصنع الساكنة
توفر أصناف الأدوات أساليب مساعدة ساكنة دون حالة للمثيل. أما أساليب المصنع الساكنة فهي بدائل مُسمّاة للمُنشئات، وتوفر قابلية قراءة وتخزينًا مؤقتًا ومرونة أفضل.
أصناف الأدوات
لا تملك فئة الأدوات حالة للمثيل — فهي حاوية لأساليب ساكنة. اجعل إنشاء مثيل منها غير ممكن عبر تعريف مُنشئ خاص.
final class StringUtils {
// Private constructor prevents instantiation
private StringUtils() {
throw new UnsupportedOperationException("Utility class");
}
public static boolean isBlank(String s) {
return s == null || s.strip().isEmpty();
}
public static String capitalize(String s) {
if (isBlank(s)) return s;
return Character.toUpperCase(s.charAt(0)) + s.substring(1).toLowerCase();
}
}
System.out.println(StringUtils.isBlank(" ")); // true
System.out.println(StringUtils.capitalize("hELLO")); // Helloأصناف الأدوات في المكتبة القياسية
تزخر مكتبة Java القياسية بأصناف الأدوات: Collections وArrays وObjects وFiles وPaths وMath.
import java.util.*;
List<Integer> nums = new ArrayList<>(Arrays.asList(5, 2, 8, 1, 9, 3));
Collections.sort(nums);
System.out.println(nums); // [1, 2, 3, 5, 8, 9]
System.out.println(Collections.min(nums)); // 1
System.out.println(Collections.max(nums)); // 9
Collections.shuffle(nums); // random order
int[] arr = {3, 1, 4, 1, 5};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [1, 1, 3, 4, 5]
System.out.println(Arrays.binarySearch(arr, 4)); // 3 (index)أساليب المصنع الساكنة
أسلوب المصنع الساكن هو أسلوب ساكن مُسمّى ينشئ مثيلًا ويعيده. ومن فوائده: الأسماء الوصفية، وإمكانية إعادة مثيلات مخزنة مؤقتًا أو من نوع فرعي، وإمكانية إعادة null.
class Connection {
private final String host;
private final int port;
private final boolean ssl;
private Connection(String host, int port, boolean ssl) {
this.host = host; this.port = port; this.ssl = ssl;
}
// Named factory methods — more expressive than constructors
public static Connection plain(String host) {
return new Connection(host, 80, false);
}
public static Connection secure(String host) {
return new Connection(host, 443, true);
}
}
Connection c = Connection.secure("api.example.com");
// Much clearer than: new Connection("api.example.com", 443, true)التخزين المؤقت باستخدام مصنع ساكن
يمكن للمصانع الساكنة إعادة مثيلات مخزنة مؤقتًا، مما يتجنب التخصيص المتكرر للقيم الشائعة (كما يفعل Integer.valueOf للقيم من -128 إلى 127).
class Color {
private static final Map<String, Color> CACHE = new HashMap<>();
public final int r, g, b;
private Color(int r, int g, int b) {
this.r = r; this.g = g; this.b = b;
}
public static Color of(int r, int g, int b) {
String key = r + "," + g + "," + b;
return CACHE.computeIfAbsent(key, k -> new Color(r, g, b));
}
public static final Color RED = of(255, 0, 0);
public static final Color GREEN = of(0, 255, 0);
public static final Color BLUE = of(0, 0, 255);
}
System.out.println(Color.of(255,0,0) == Color.RED); // true (cached)المصنع مقارنةً بالمُنشئ: التسمية
اصطلاحات التسمية الشائعة لأساليب المصنع الساكنة:
of— مصنع تجميعيfrom— مصنع للتحويلvalueOf— مصنع للتحويل (في واجهات برمجة التطبيقات الأقدم)getInstance— مثيل وحيدcreate/newInstance— كائن جديدget— اسم مرن
// Java API examples:
Optional.of(value) // of
LocalDate.from(temporal) // from
Integer.valueOf(42) // valueOf
Calendar.getInstance() // getInstance
Array.newInstance(type, length) // newInstance
// Your own:
HttpRequest.post("https://api.example.com/users")
ApiResponse.error(404, "Not found")
Payment.creditCard("4242...", 9999, "USD")إعادة أنواع فرعية
يمكن لأسلوب المصنع إعادة نوع فرعي، بينما يكون نوع القيمة المُعادة المُعلن هو الواجهة. وهكذا لا يرتبط المستدعون بالتنفيذ الملموس.
interface Validator<T> {
boolean validate(T value);
String errorMessage();
}
class EmailValidator implements Validator<String> {
public boolean validate(String email) { return email.contains("@"); }
public String errorMessage() { return "Invalid email address"; }
}
class Validators {
// Returns interface type — hides implementation
public static Validator<String> email() { return new EmailValidator(); }
public static Validator<String> notBlank() {
return new Validator<>() {
public boolean validate(String s) { return s != null && !s.isBlank(); }
public String errorMessage() { return "Value required"; }
};
}
}نمط Builder باستخدام مصنع ساكن
اجمع بين مُنشئ خاص ومصنع ساكن وBuilder متداخل لإنشاء كائنات معقدة.
class EmailMessage {
private final String to, subject, body;
private final boolean html;
private EmailMessage(Builder b) {
this.to = b.to; this.subject = b.subject;
this.body = b.body; this.html = b.html;
}
public static Builder builder(String to) { return new Builder(to); }
public static class Builder {
private final String to;
private String subject = "", body = "";
private boolean html = false;
Builder(String to) { this.to = to; }
public Builder subject(String s) { this.subject = s; return this; }
public Builder body(String b) { this.body = b; return this; }
public Builder html() { this.html = true; return this; }
public EmailMessage build() { return new EmailMessage(this); }
}
}
EmailMessage.builder("alice@co.com").subject("Welcome!").html().build();التحقق من الصحة في أساليب المصنع
تُعد أساليب المصنع مناسبة جدًا للتحقق من صحة المدخلات قبل الإنشاء — اطرح استثناءات ذات معنى تتضمن السياق.
class PortNumber {
private final int value;
private PortNumber(int value) { this.value = value; }
public static PortNumber of(int port) {
if (port < 1 || port > 65535)
throw new IllegalArgumentException(
"Port must be 1-65535, got: " + port);
return new PortNumber(port);
}
public static PortNumber http() { return new PortNumber(80); }
public static PortNumber https() { return new PortNumber(443); }
public int value() { return value; }
public boolean isPrivileged() { return value < 1024; }
}
System.out.println(PortNumber.https().isPrivileged()); // trueواجهة Collections API: المصانع الساكنة
أضافت Java 9 والإصدارات الأحدث List.of() وSet.of() وMap.of() — وهي أساليب مصنع ساكنة تنشئ مجموعات غير قابلة للتغيير.
import java.util.*;
List<String> fruits = List.of("Apple", "Banana", "Cherry");
Set<Integer> ids = Set.of(1, 2, 3, 4, 5);
Map<String, Integer> ages = Map.of("Alice", 30, "Bob", 25);
// All are unmodifiable:
try {
fruits.add("Durian"); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Cannot modify!");
}
// Map.entry and Map.ofEntries for > 10 entries
Map<String, String> config = Map.ofEntries(
Map.entry("host", "localhost"),
Map.entry("port", "8080")
);متى تُفضَّل أساليب المصنع
فضّل أساليب المصنع الساكنة على المُنشئات عندما:
- تريد اسمًا وصفيًا
- قد يعيد المصنع مثيلًا مخزنًا مؤقتًا أو من نوع فرعي
- تحتاج إلى التحقق من الصحة قبل الإنشاء
- تريد التحكم في عدد المثيلات (Singleton أو تجمع)
// Constructor: hard to know what this means
new Complex(0.5, -1.2);
// Factory: clear meaning
Complex.fromPolar(1.3, Math.PI / 4); // polar form
Complex.rectangular(0.5, -1.2); // rectangular form
// Constructor: no caching
new Boolean(true); // deprecated — creates new object!
// Factory: returns cached instance (Boolean.TRUE or FALSE)
Boolean.valueOf(true); // returns Boolean.TRUE singletonتحقق سريع
ما الميزة الرئيسية لأسلوب المصنع الساكن مقارنةً بالمُنشئ العام؟
مراجعة: أصناف الأدوات وأساليب المصنع الساكنة
أهم النقاط:
- أصناف الأدوات: صنف final ذو مُنشئ خاص وجميع أساليبه ساكنة
- أساليب المصنع الساكنة بدائل مُسمّاة للمُنشئات
- التسميات الشائعة: of وfrom وvalueOf وgetInstance وcreate وnewInstance
- يمكن للمصانع إعادة مثيلات مخزنة مؤقتًا — راجع Integer.valueOf(-128..127)
- يمكن للمصانع إعادة أنواع فرعية مع إخفاء التنفيذ الملموس
- استخدم أدوات البناء داخل المصانع للإنشاء المعقد ذي المعاملات المتعددة
الأسئلة الشائعة
هل درس «فئات الأدوات وأساليب المصنع الثابتة» مجاني؟
نعم — نص درس «فئات الأدوات وأساليب المصنع الثابتة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «فئات الأدوات وأساليب المصنع الثابتة»؟
صمّم فئات أدوات لا يمكن إنشاء كائنات منها، ووفّر أساليب مصنع ثابتة بديلة عن المنشئات تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «فئات الأدوات وأساليب المصنع الثابتة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قواعد تحميل الأساليب الزائد
- معاملات Varargs
- الحقول والثوابت الثابتة
- فئات الأدوات وأساليب المصنع الثابتة