java - क्या मुझे विरासत में मिली कक्षा में अशक्त तरीकों के साथ अशक्त तरीकों की अशक्तता को दूर करना चाहिए




android kotlin (4)

Android 3.5.1

मैं WebView का उपयोग कर रहा था और मैंने देखा कि जब मैं कुछ तरीकों को ओवरराइड करता हूं तो सभी पैरामीटर अशक्त प्रकार के होते हैं:

webview.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
         return super.shouldOverrideUrlLoading(view, request)
    }
}

जिसका मतलब है कि मुझे उनका उपयोग करने के लिए safe call ऑपरेटर का उपयोग करना होगा। हालाँकि, जब मैंने WebViewClient वर्ग को देखा कि मैंने इस पद्धति को ओवरराइड कर दिया है तो वे जावा कोड में nullable एनोटेशन के रूप में निर्दिष्ट नहीं हैं।

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}

तो मैं सोच रहा हूँ कि क्या मैं अशक्त विधि से अशक्तता को दूर करूँ या उन्हें रखूँ?


वे जावा कोड में अशक्त एनोटेशन के रूप में निर्दिष्ट नहीं हैं।

यदि यह सच है कि आप एक NullPointerException फेंकने का जोखिम उठाते हैं, अगर जावा कोड में अशक्त एनोटेशन के रूप में निर्दिष्ट नहीं किया गया है और एक शून्य मान असाइन करें। यदि जावा कोड में अशक्त एनोटेशन के रूप में निर्दिष्ट नहीं है, तो अप्रभावी विधि से अशक्तता को हटा दें।

अधिक विवरण के लिए this भी पढ़ें


अशक्त संदर्भ अब हर किसी के लिए बहुत स्पष्ट अपवाद है क्योंकि सी / सी ++ पर मूल विकास के साथ सब कुछ शुरू हो गया है। स्मृति में वस्तुओं का संदर्भ अलग-अलग कारणों से गायब या साफ हो सकता है। जावा को उन मूल भाषाओं के रूप में डिजाइन किया गया था , जो हर जगह अशक्त संकेत मानती हैं।

सभी म्यूटेबल स्टेट्स को मैनेज करने में हज़ार माइक्रोसर्विसेस का मज़ा आ रहा है। यह अशक्त संदर्भ के लिए बहुत अधिक समाधान का कारण बनता है। - Optional वस्तुएं - Null Object नकली - संदर्भों के चारों ओर Wrappers - Annotations , आदि और कहीं आवंटित वस्तु की बदलती स्थिति से बचने के लिए यह सब।

अंत में, कोटलिन पहले यहाँ नहीं है। स्केला, अपरिवर्तनीय राज्यों में उपयोग और समर्थन एप्लिकेशन में उत्कृष्ट अनुभव था। तो इस सवाल का जवाब देना और संक्षेप में जावा को इसके मूल C ++ से इस तरह से डिजाइन किया गया था, और आपको हर जगह अशक्त मूल्यों की उम्मीद करनी चाहिए। हम अभी भी अशक्त के लिए संदर्भ की जाँच कर रहे हैं, यहां तक ​​कि यह इस कारण से @Nullable नहीं है। और उसी तरह कोटलिन जावा उपयोग को संभालता है, और इसीलिए आपको ओवरराइड विधियों में अशक्त मूल्यों को संभालने की आवश्यकता होती है।


कोटलिन के विपरीत, डिफ़ॉल्ट रूप से जावा ऑब्जेक्ट शून्य मान स्वीकार कर सकते हैं

@ Nullable एनोटेशन का उपयोग कोड एनालाइज़र जैसे कार्यों के लिए किया जाता है (उदाहरण के लिए। यदि @ Nullable पैरामीटर को विधि के अंदर संभाला नहीं जाता है तो यह चेतावनी दिखाएगा)

@ नोनल एनोटेशन का उपयोग यह निर्दिष्ट करने के लिए किया जाता है कि प्राप्त मूल्य शून्य नहीं हो सकता है

if(@NonNull){
      can omit ? check
}else if(@Nullable){
     Mandatory to put ? check
}else(No annotation){
     Not mandatory but put on safer side .
     Passing null from Java into Kotlin fun without ? will lead to NPE
    if(putting ? check){
     java equivalent Kotlin param  (@Nullable Webview view)
    } else{
     java equivalent Kotlin param (@NonNull Webview view)
    }

}

इसे भी देखें: https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#null-safety


भाषा-स्तर पर, इसे सामान्यीकृत किया जा सकता है:

उचित जावा इंटरऑपरेबिलिटी के लिए, कोटलिन कोड को जावा कोड के एनोटेशन को प्रतिबिंबित करना चाहिए।

लाइनर केवल कोटलिन इंटरऑपरेबिलिटी के लिए दूसरी दिशा में एनोटेशन की कमी के बारे में शिकायत करता है।

जावा फ्रेंडली कोटलिन कोड लिखने के तरीके पर यह हालिया लेख देखें





nullable