Null-Restricted और Nullable Types
(bugs.openjdk.org)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 में
Stringtype का variableStringobject 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 से हटा दिए जाते हैं
- नया
NullRestrictedattribute यह दर्शाता है कि field null value की अनुमति नहीं देता
Core reflection
Foo!.classयाFoo?.classliterals मौजूद नहीं हैं- नया RuntimeType API runtime पर null-restricted variant का वर्णन करता है
पूरक परिवर्तन
- पारंपरिक serialization null-restricted fields और arrays के साथ compatible नहीं है
- javadoc में nullness markers शामिल होते हैं
java.lang.reflect.Typeऔरjavax.lang.modelAPI nullness को encode करते हैं
विकल्प
- Java ecosystem के विभिन्न developer tools अपने-अपने तरीके से null tracking लागू करते हैं
- अन्य programming languages type system में nullness को track करती हैं
- runtime nullness enforcement को explicit checks या
Objects.requireNonNullcall से लागू किया जा सकता है
निर्भरताएँ
- 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 टिप्पणियां
Hacker News राय
C# और Kotlin के null handling तरीकों की तुलना
lateinit vardeclaration के ज़रिए uninitialized non-nullable variable को बाद में initialize करने की सुविधा देता हैनए proposal पर राय
nullness-narrowing automatic conversion को लेकर चिंता
सभी variables को डिफ़ॉल्ट रूप से non-null के रूप में चिह्नित करने के तरीके की ज़रूरत
T!syntax इस्तेमाल करना पड़ेगा, जिससे code जटिल हो जाएगाJava में language-level explicit optionality feature की ज़रूरत
standard library पर language improvements लागू न करने के फ़ैसले की आलोचना
compile-time warnings को errors में promote करने के आसान तरीके की ज़रूरत
डिफ़ॉल्ट रूप से non-nullable, immutable, और narrow scope सेट करने की ज़रूरत
Hack language में null handling का अनुभव
Java SDK में इस feature को लागू किया जा सकता है या नहीं, इस पर सवाल
संबंधित links