1. सिंथेटिक शुगर

प्रोग्रामर पसंद करते हैं जब कुछ जटिल कोड या तर्क को कुछ पंक्तियों में लिखा जा सकता है, जिससे कोड कॉम्पैक्ट और पठनीय हो जाता है। और प्रोग्रामिंग भाषाओं के निर्माता कभी-कभी इसमें मदद करते हैं।

एक चालाक भाषा सुविधा जो आपको शॉर्टकट लेने देती है (कम कोड लिखें) को सिंटैक्टिक चीनी कहा जाता है । लेकिन, ईमानदार होने के लिए, जावा में यह बहुत कम है।

जावा के रचनाकारों ने जावा में किसी भी अतिरेक को खत्म करने के लिए वह सब कुछ किया जो वे कर सकते थे। यदि C++ आपको 20 तरीकों से कुछ करने देता है, तो Java आपको इसे केवल एक तरीके से करने देता है।

लेकिन न तो जावा प्रोग्रामर और न ही जावा के रचनाकारों को स्वतंत्रता की कमी पसंद आई। और कभी-कभी चीनी आपके और मेरे जैसे आम लोगों के लिए जीवन को आसान बना देती है।

वैसे, आप पहले से ही कुछ सिंटैक्टिक चीनी का सामना कर चुके हैं: ऑटोबॉक्सिंग और अनबॉक्सिंग । आइए तुलना करें:

लंबा कोड कॉम्पैक्ट कोड
Integer a = new Integer(5);
int b = a.intValue();
Integer a = 5;
int b = a;
int b = 5;
Integer c = new Integer(b);
int b = 5;
Integer c = b;
Integer a = new Integer(1);
int b = 1;
if (a.intValue() == b)
{
   ...
}
Integer a = 1;
int b = 1;
if (a == b)
{
   ...
}

बाईं ओर लंबे कोड के बजाय, आप दाईं ओर अधिक कॉम्पैक्ट कोड लिख सकते हैं। और बुद्धिमान जावा संकलक कोड के लघु संस्करण के आधार पर कोड का वर्बोज़ संस्करण उत्पन्न करेगा। यही सिंटैक्टिक शुगर है।


2. एक चर के प्रकार का निष्कर्ष: varखोजशब्द

जावा 11 में, कंपाइलर और भी स्मार्ट हो गया और अब इसे निर्दिष्ट मान के प्रकार के आधार पर घोषित चर के प्रकार का निर्धारण कर सकता है । कोड में, ऐसा दिखता है:

var name = value;

जहां nameएक नए चर का नाम है, मूल्य इसका प्रारंभिक मूल्य है, और varएक कीवर्ड है जिसका उपयोग चर घोषित करने के लिए किया जाता है। नाम चर का प्रकार वही होगा जो इसे निर्दिष्ट मान का प्रकार है।

उदाहरण:

हम कोड को कैसे देखते हैं संकलक क्या देखता है
var i = 1;
int i = 1;
var s = "Hello";
String s = "Hello";
var console = new Scanner(System.in);
Scanner console = new Scanner(System.in);
var list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<String>();
var data = new int[]{1, 2, 3};
int[] data = new int[]{1, 2, 3};

कंपाइलर स्वयं निर्धारित मान के आधार पर चर के प्रकार को निर्धारित करता है या अनुमान लगाता है।

भाषा में ऐसी सुविधा जोड़ने के लिए प्रोग्रामरों ने गर्मागर्म बहस की। बहुत से लोगों को डर था कि इसका varदुरुपयोग किया जाएगा और परिणामस्वरूप कोड की पठनीयता को नुकसान होगा।

इसमें सच्चाई का एक अंश है, इसलिए इसका उपयोग करना सबसे अच्छा है varजहां यह कोड की पठनीयता को बढ़ाता है। उदाहरण के लिए, ये दो मामलों में:

केस 1: वेरिएबल को असाइन किए गए मान को देखते हुए, वेरिएबल का प्रकार तुरंत स्पष्ट होता है

कोड व्याख्या
var stream = url.getInputStream();
चर एक हैInputStream
var name = person.getFullName();
चर एक हैString

इन मामलों में, आपको उपयोग नहीं करना चाहिएvar । अच्छा, चर का प्रकार क्या है?

कोड व्याख्या
var result = task.execute();
चर के प्रकार को निर्धारित करना कठिन है
var status = person.getStatus();
चर के प्रकार को निर्धारित करना कठिन है

केस 2: कोड को समझने के लिए वेरिएबल का प्रकार महत्वपूर्ण नहीं है

कोड को अक्सर एक चर पर विधियों को कॉल करने की आवश्यकता नहीं होती है, उदाहरण के लिए जब एक चर का उपयोग अस्थायी रूप से कुछ स्टोर करने के लिए किया जाता है। इस मामले में, varनिश्चित रूप से उपयोग करने से कोड की पठनीयता कम नहीं होती है:

लंबा कोड कॉम्पैक्ट कोड
var data = stream.getMetaData();
storage.save(data)
हमने स्ट्रीम से मेटाडेटा प्राप्त किया और इसे रिपॉजिटरी streamमें सहेजा । storageचर dataका विशिष्ट प्रकार महत्वपूर्ण नहीं है।

सुनहरा मतलब

अब मैं एक ही कोड लिखने के तीन तरीके दूंगा। प्रयोग करना varसबसे अच्छा विकल्प होगा।

कोड टिप्पणी
dest.writeHeaderInfo(src.getFileMetaInfo());
बहुत कॉम्पैक्ट
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
बस सही
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
बहुत विस्तृत

headerInfo1 पंक्ति वाले संस्करण से 2 पंक्तियों वाले संस्करण की ओर बढ़ते हुए, हमने चर नाम ( ) का उपयोग करके कोड को थोड़ा अधिक पठनीय बनाया। अब यह स्पष्ट है कि विधि न केवल मेटा जानकारी लौटाती है, बल्कि हेडर सूचना भी देती है।

तीसरा संस्करण अत्यधिक वर्बोज़ है। तथ्य यह headerInfoहै कि ए पहले से ही विधि FileMetaInfoसे काफी स्पष्ट है । getFileMetaInfo()मेटा जानकारी का उद्देश्य कहीं अधिक रोचक है।



3. हीरा ऑपरेटर के साथ प्रकार को छोड़ना:<>

ऑपरेटर के प्रकट होने से पहले ही var, संकलक को यह सिखाने का प्रयास किया गया था कि संग्रह प्रकारों का अनुमान कैसे लगाया जाए। आप सहमत होंगे कि यह अंकन थोड़ा बेमानी लगता है:

ArrayList<String> list = new ArrayList<String>();

जावा के सातवें संस्करण से शुरू करते हुए, संग्रह प्रकार लिखते समय, आप संग्रह तत्वों के प्रकार को छोड़ सकते हैं यदि यह एक चर घोषित करते समय निर्दिष्ट किया गया हो। दूसरे शब्दों में, उपरोक्त कोड को थोड़ा संक्षिप्त रूप में लिखा जा सकता है:

ArrayList<String> list = new ArrayList<>();

जैसा कि आप देख सकते हैं, अब आपको दूसरी बार String लिखने की आवश्यकता नहीं है। वेर ऑपरेटर के साथ उतना अच्छा नहीं है, लेकिन यह उस समय प्रगति की तरह लग रहा था।

संग्रह प्रकार में खाली कोण कोष्ठक को हीरा ऑपरेटर कहा जाता था , क्योंकि दो कोण कोष्ठक अस्पष्ट रूप से हीरे के समान होते हैं।

एक ही समय मेंvar कीवर्ड और हीरा ऑपरेटर का उपयोग करना अवांछनीय है :

var list = new ArrayList<>();

संग्रह में संग्रहीत तत्वों के प्रकार के बारे में कोई जानकारी नहीं है, और संग्रह प्रकार ArrayList < ऑब्जेक्ट > होगा।



4. डबल घुंघराले ब्रेसिज़

त्वरित सरणी आरंभीकरण याद रखें?

हमने केवल घुंघराले ब्रेसिज़ में मानों को इस तरह सूचीबद्ध किया है:

उदाहरण
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

जावा के रचनाकारों को एक सरणी के लेखन तत्वों को सरल बनाने के लिए घुंघराले ब्रेसिज़ का उपयोग करने का विचार पसंद आया। लेकिन संग्रहों का क्या?

जावा के रचनाकारों के पास संग्रह के लिए भी पर्याप्त रचनात्मक सोच थी, जिससे उन्हें डबल कर्ली ब्रेसिज़ के साथ एक ट्रिक का उपयोग करने की अनुमति मिली।

चीनी के साथ चीनी के बिना
var list = new ArrayList<String>()
{{
   add("Hello");
   add("How's");
   add("Life?");
}};
var list = new ArrayList<String>();

list.add("Hello");
list.add("How's");
list.add("Life?");

यदि कंपाइलर बाईं ओर के उदाहरण की तरह कोड का सामना करता है, तो वह इसे दाईं ओर के कोड में बदल देता है।

कोड बहुत अधिक कॉम्पैक्ट नहीं बनता है। यहां बचत काफी नगण्य है: आपको listहर बार लिखने की जरूरत नहीं है। यदि चर नाम बहुत लंबा है तो यह मददगार हो सकता है।

लेकिन अगर आपको किसी प्रोजेक्ट में इस तरह का कोड मिलता है, तो हैरान न हों 🙂