1 पॉइंट द्वारा GN⁺ 2024-08-04 | 1 टिप्पणियां | WhatsApp पर शेयर करें

Null-Restricted and Nullable Types (Preview)

सारांश

Java types में null को अनुमति देने या अस्वीकार करने वाले nullness markers को support करने वाला एक preview language feature.

लक्ष्य

  • Java के reference types को बेहतर बनाना ताकि programmer यह व्यक्त कर सके कि null reference अपेक्षित है या नहीं
  • अलग-अलग nullness properties वाले types के बीच conversion को support करना, और गलत तरीके से संभाले गए null values के लिए warning देना
  • मौजूदा Java code के साथ compatibility बनाए रखना, और नए feature को क्रमिक रूप से अपनाने की सुविधा देना
  • यह सुनिश्चित करना कि null को अस्वीकार करने वाले type के variables को पहली बार पढ़ने से पहले initialize किया जाए
  • अलग से compile की गई classes में भी null को अस्वीकार करने वाले types को runtime पर enforce करना
  • runtime optimization के लिए आवश्यक metadata और integrity guarantees प्रदान करना

गैर-लक्ष्य

  • मौजूदा code की अपने-आप पुनर्व्याख्या नहीं करना
  • हर null value को स्पष्ट रूप से handle करने की अनिवार्यता नहीं बनाना
  • primitive types के लिए बदलाव शामिल नहीं करना
  • standard library पर language improvements लागू नहीं करना

प्रेरणा

  • Java program में String type का variable String object reference या null value रख सकता है
  • किसी variable में null की अनुमति है या नहीं, इसे स्पष्ट रूप से व्यक्त न कर पाने से भ्रम और bugs पैदा होते हैं
  • developers को ऐसा tool देने की आवश्यकता है जिससे वे type के हिस्से के रूप में यह घोषित कर सकें कि null values supported हैं या अपेक्षित नहीं हैं

विवरण

Nullness properties और markers

  • reference types वैकल्पिक रूप से nullness को व्यक्त कर सकते हैं
  • Foo! null को शामिल न करने वाला null-restricted type है
  • Foo? null को शामिल करने वाला nullable type है
  • default रूप से Foo की nullness निर्दिष्ट नहीं होती

Fields और arrays का initialization

  • null-restricted fields या arrays को उपयोग से पहले अनिवार्य रूप से initialize किया जाना चाहिए
  • initialize न किए गए null-restricted field को पढ़ने पर exception होगा

Expression nullness और conversion

  • Java compiler हर expression की nullness निर्धारित करता है
  • nullness conversion के माध्यम से अलग nullness वाले expressions को संभाला जा सकता है
  • narrowing nullness conversion runtime पर NullPointerException पैदा कर सकता है

Runtime null checks

  • narrowing nullness conversion होने पर NullPointerException होता है

Type variables की nullness

  • type variables भी nullness व्यक्त कर सकते हैं
  • null-restricted और nullable type variables generic code के भीतर विशिष्ट nullness का दावा करते हैं

Type arguments और bounds

  • type arguments nullness व्यक्त कर सकते हैं, और इससे API की nullness प्रभावित होती है
  • nullness से मेल न खाने वाले type arguments warning पैदा कर सकते हैं

Method overriding और type argument inference

  • method signature समान है या नहीं, यह तय करते समय nullness को नज़रअंदाज़ किया जाता है
  • overriding method का return type nullness conversion के ज़रिए परिवर्तित किया जा सकता है

Compiler warnings

  • null-restricted type बनाने पर नए compile-time errors उत्पन्न हो सकते हैं
  • narrowing nullness conversion, null-hostile operations में ? type का उपयोग आदि warning उत्पन्न कर सकते हैं

Compilation और class file representation

  • अधिकांश null markers class files से हटा दिए जाते हैं
  • नया NullRestricted attribute यह दर्शाता है कि field null value की अनुमति नहीं देता

Core reflection

  • Foo!.class या Foo?.class literals मौजूद नहीं हैं
  • नया RuntimeType API runtime पर null-restricted variant का वर्णन करता है

पूरक परिवर्तन

  • पारंपरिक serialization null-restricted fields और arrays के साथ compatible नहीं है
  • javadoc में nullness markers शामिल होते हैं
  • java.lang.reflect.Type और javax.lang.model API nullness को encode करते हैं

विकल्प

  • Java ecosystem के विभिन्न developer tools अपने-अपने तरीके से null tracking लागू करते हैं
  • अन्य programming languages type system में nullness को track करती हैं
  • runtime nullness enforcement को explicit checks या Objects.requireNonNull call से लागू किया जा सकता है

निर्भरताएँ

  • Flexible Constructor Bodies (Second Preview) आवश्यक है
  • Null-Restricted Value Class Types (Preview) और JEP 402: Enhanced Primitive Boxing (Preview) जैसे भविष्य के कार्य

GN⁺ का सार

  • यह JEP Java में null values को स्पष्ट रूप से handle करने के लिए tools प्रदान करता है, जिससे code की stability और readability बढ़ती है
  • null-restricted और nullable types को पेश करके null references से होने वाले bugs को कम किया जा सकता है
  • यह मौजूदा code के साथ compatible है और इसे क्रमिक रूप से अपनाया जा सकता है, जिससे developers को flexibility मिलती है
  • अन्य भाषाओं की तुलना में यह Java की null handling क्षमता को मजबूत कर सकता है
  • समान सुविधा देने वाले tools में Kotlin का null-safety feature शामिल है

1 टिप्पणियां

 
GN⁺ 2024-08-04
Hacker News राय
  • C# और Kotlin के null handling तरीकों की तुलना

    • C# में प्रोजेक्ट में nullability सक्षम करने पर सभी variables डिफ़ॉल्ट रूप से non-null घोषित होते हैं
    • Kotlin भी similar है, लेकिन उसे backwards compatibility की आवश्यकता नहीं है
    • Kotlin lateinit var declaration के ज़रिए uninitialized non-nullable variable को बाद में initialize करने की सुविधा देता है
  • नए proposal पर राय

    • मौजूदा variables को nullable, explicitly nullable, और explicitly non-nullable में विभाजित किया जाता है
    • C# का approach बेहतर लगता है, खासकर legacy codebase में nullability issues को हल करने की ज़रूरत न होने के कारण
    • लेकिन C# approach codebase में nullability issues को तुरंत highlight भी कर देता है
  • nullness-narrowing automatic conversion को लेकर चिंता

    • automatic conversion गलत एहसास देता है
    • कुछ मामलों में compiler error आना चाहिए
    • explicit conversion ज़्यादा सुरक्षित है
  • सभी variables को डिफ़ॉल्ट रूप से non-null के रूप में चिह्नित करने के तरीके की ज़रूरत

    • package या file level पर सभी variables को non-null के रूप में चिह्नित करने का तरीका होना चाहिए
    • नहीं तो लगभग हर variable के लिए T! syntax इस्तेमाल करना पड़ेगा, जिससे code जटिल हो जाएगा
  • Java में language-level explicit optionality feature की ज़रूरत

    • Kotlin और Typescript के अनुभव के आधार पर language-level support बेहतर है
    • Java में NullAway जैसे tools झंझट वाले हैं
  • standard library पर language improvements लागू न करने के फ़ैसले की आलोचना

    • PHP इस्तेमाल के अनुभव में standard library के साथ interaction झंझट भरा रहा
    • standard library में ऐसी expressiveness जोड़ना ज़रूरी है
  • compile-time warnings को errors में promote करने के आसान तरीके की ज़रूरत

    • Java मुख्य रूप से static typed language है, इसलिए dynamic behavior लाना अच्छा नहीं है
  • डिफ़ॉल्ट रूप से non-nullable, immutable, और narrow scope सेट करने की ज़रूरत

    • नए design decisions अक्सर तुरंत मिलने वाली सुविधा के लिए safe path छोड़ देते हैं
    • कई languages और technologies में इस समस्या की वजह से बहुत सी errors होती हैं
  • Hack language में null handling का अनुभव

    • Hack के type system में nullness एक महत्वपूर्ण हिस्सा है
    • nullable arrays को लेकर सवाल
    • Java में समस्या यह है कि सारा legacy code nullability को मानकर चलता है
  • Java SDK में इस feature को लागू किया जा सकता है या नहीं, इस पर सवाल

    • legacy code पर इसे कैसे लागू किया जा सकता है, इसको लेकर संदेह
  • संबंधित links