मैं संदेश ऑब्जेक्ट्स के एक सेट से निपट रहा हूं, जिनमें से प्रत्येक के अनुरूप एक अद्वितीय पहचानकर्ता है। प्रत्येक संदेश या तो मानचित्र से या बाइटबफर से बनाया जा सकता है (संदेश द्विआधारी हैं, लेकिन हम जानते हैं कि बाइनरी प्रतिनिधित्व से कैसे और कैसे स्थानांतरित करना है)।जावा - स्थैतिक फैक्ट्री विधि और स्विच स्टेटमेंट
public static Message fromMap(int uuid, Map<String, Object> fields) {
switch (uuid) {
case FIRST_MESSAGE_ID:
return new FirstMessage(fields);
.
.
.
default:
// Error
return null;
}
}
public static Message fromByteBuffer(int uuid, ByteBuffer buffer) {
switch (uuid) {
case FIRST_MESSAGE_ID:
return new FirstMessage(buffer);
.
.
.
default:
// Error
return null;
}
}
अब, आइटम 1 के बारे में बात करती है Josh Bloch's Effective Java: इस प्रकार
इन संदेशों के निर्माण के लिए वर्तमान कार्यान्वयन मोटे तौर पर है पर विचार करें कंस्ट्रक्टर्स के बजाय आंकड़े कारखाने विधियों, और इस जहां इस पद्धति है एक जगह हो रहा है उपयोगी (ग्राहक सीधे संदेश उपप्रकारों के रचनाकारों तक नहीं पहुंचते हैं, इसके बजाय वे इस विधि से गुज़रते हैं)। लेकिन मुझे इस तथ्य को पसंद नहीं है कि हमें दो स्विच स्टेटमेंट्स को अपडेट रखना याद रखना है (DRY सिद्धांत का उल्लंघन करता है)।
मैं इसे पूरा करने के सर्वोत्तम तरीके में किसी भी अंतर्दृष्टि की सराहना करता हूं; हम ऑब्जेक्ट्स कैशिंग नहीं कर रहे हैं (प्रत्येक कॉल से मैप या सेबटेबफर एक नई ऑब्जेक्ट लौटाएगा), जो इस तरह की एक स्थिर फैक्ट्री विधि का उपयोग करने के कुछ लाभों को अस्वीकार करता है। इस कोड के बारे में कुछ मुझे गलत मानता है, इसलिए मुझे समुदाय के विचारों को सुनना अच्छा लगेगा कि क्या यह नई वस्तुओं का निर्माण करने का एक वैध तरीका है, या यदि कोई बेहतर समाधान नहीं होगा।
यदि कारखाने की वस्तुओं को मानचित्र में संग्रहीत किया जाता है और यूयूआईडी द्वारा पुनर्प्राप्त किया जाता है, तो कोई स्विच की आवश्यकता नहीं होती है। – rsp
yup, मैंने यही कहा है :-) मैंने आपके उत्तर में एक लिंक भी जोड़ा है :) – Fortega
यह एक अच्छा समाधान है (इसलिए इसके लिए +1) लेकिन यदि लक्ष्य डबल स्विच से छुटकारा पाना था तो आप बस अनुमान लगा सकते थे स्विच तर्क को एक अलग विधि से बाहर करें। (नक्शा मूल रूप से भेस में एक स्विच है) – wds