मेरा मानना है कि विहित के दो संबंधित उपयोग हैं: रूप और उदाहरण।
एक विहित रूप का मतलब है कि एक विशेष प्रकार के संसाधन के मूल्यों को कई तरीकों से वर्णित या प्रस्तुत किया जा सकता है, और उन तरीकों में से एक को इष्ट विहित रूप के रूप में चुना जाता है। (उस फॉर्म को कैनॉनाइज्ड किया जाता है , जैसे कि किताबें जो इसे बाईबल में बनाती हैं, और अन्य फॉर्म नहीं हैं।) एक विहित फॉर्म का एक क्लासिक उदाहरण एक पदानुक्रमित फ़ाइल सिस्टम में पथ है, जहां एक एकल फ़ाइल को कई तरीकों से संदर्भित किया जा सकता है। :
myFile.txt # in current working dir
../conf/myFile.txt # relative to the CWD
/apps/tomcat/conf/myFile.txt # absolute path using symbolic links
/u1/local/apps/tomcat-5.5.1/conf/myFile.txt # absolute path with no symlinks
उस फ़ाइल के विहित प्रतिनिधित्व की क्लासिक परिभाषा अंतिम रास्ता होगा। स्थानीय या सापेक्ष पथों के साथ आप बिना संदर्भ जानकारी के संसाधन की विश्व स्तर पर पहचान नहीं कर सकते। निरपेक्ष रास्तों से आप संसाधन की पहचान कर सकते हैं, लेकिन यह नहीं बता सकते कि दो रास्ते एक ही इकाई को संदर्भित करते हैं। दो या अधिक पथों को उनके विहित रूपों में परिवर्तित करने के साथ, आप उपरोक्त सभी कार्य कर सकते हैं, साथ ही यह भी निर्धारित कर सकते हैं कि दो संसाधन समान हैं या नहीं, यदि यह आपके आवेदन के लिए महत्वपूर्ण है ( अलियासिंग समस्या को हल करें )।
ध्यान दें कि संसाधन का विहित रूप स्वयं उस विशेष रूप का एक गुण नहीं है; किसी दिए गए प्रकार के लिए कई संभावित विहित रूप हो सकते हैं जैसे फ़ाइल पथ (कहते हैं, लेक्सिक रूप से सबसे पहले संभव पूर्ण पथ)। एक फॉर्म सिर्फ एक विशेष आवेदन कारण के लिए विहित रूप के रूप में चुना जाता है, या शायद मनमाने ढंग से ताकि सभी एक ही भाषा बोलते हैं।
वस्तुओं को अपने विहित उदाहरणों में रखने के लिए एक ही मूल विचार है, लेकिन एक संसाधन के "सर्वश्रेष्ठ" प्रतिनिधित्व को निर्धारित करने के बजाय, यह मनमाने ढंग से एक ही "सामग्री" के उदाहरणों के वर्ग के एक उदाहरण को विहित संदर्भ के रूप में चुनता है, फिर सभी संदर्भों को रूपांतरित करता है एक विहित उदाहरण का उपयोग करने के लिए बराबर वस्तुओं के लिए।
यह समय और स्थान दोनों के अनुकूलन के लिए एक तकनीक के रूप में इस्तेमाल किया जा सकता है। यदि किसी अनुप्रयोग में समतुल्य वस्तुओं के कई उदाहरण हैं, तो उन सभी को एक विशेष मूल्य के एकल विहित उदाहरण के रूप में हल करने के लिए मजबूर करके, आप सभी को खत्म कर सकते हैं, लेकिन प्रत्येक स्थान और बचत समय में से एक को संभवतः अब आप तुलना कर सकते हैं ऑब्जेक्ट समतुल्यता ( equals()विधि) के विपरीत संदर्भ पहचान (==) के साथ उन मूल्यों ।
विहित उदाहरणों के साथ प्रदर्शन के अनुकूलन का एक उत्कृष्ट उदाहरण समान सामग्री के साथ तार को ढह रहा है। String.intern()एक ही वर्ण अनुक्रम के साथ दो तारों पर कॉल करने के लिए उस पाठ के लिए एक ही कैनोनिकल स्ट्रिंग ऑब्जेक्ट को वापस करने की गारंटी है। यदि आप अपने सभी तार उस कैनोनिकलाइज़र के माध्यम से पास करते हैं, तो आप जानते हैं कि समतुल्य तार वास्तव में समान वस्तु संदर्भ हैं, अर्थात, उपनाम
जावा 5.0+ में एनम प्रकार एक वीर्य के भीतर एक ही विहित उदाहरण का उपयोग करने के लिए एक विशेष एनम मान के सभी उदाहरणों को मजबूर करता है, भले ही मूल्य क्रमबद्ध और deserialized हो। इसीलिए if (day == Days.SUNDAY)अगर Daysआप एक enum टाइप है तो आप java में impunity के साथ उपयोग कर सकते हैं । अपनी कक्षाओं के लिए ऐसा करना निश्चित रूप से संभव है, लेकिन ध्यान रखता है। विवरण और सलाह के लिए जोश बलोच द्वारा प्रभावी जावा पढ़ें ।