अव्यवस्था को कम करने के अलावा जावा में अप्रयुक्त आयात को साफ करने का कोई कारण?


99

क्या जावा में अप्रयुक्त आयात के बयानों से बचने का कोई अच्छा कारण है? जैसा कि मैंने इसे समझा, वे संकलक के लिए हैं, इसलिए बहुत सारे अप्रयुक्त आयातों का संकलित कोड पर कोई प्रभाव नहीं पड़ेगा। क्या यह केवल अव्यवस्था को कम करने के लिए और रेखा के नीचे नामकरण संघर्ष से बचने के लिए है?

(मैं पूछता हूं क्योंकि ग्रहण अप्रयुक्त आयातों के बारे में एक चेतावनी देता है, जो कि कोड को विकसित करते समय मुझे परेशान करने वाला है क्योंकि मैं आयात को हटाना नहीं चाहता हूं जब तक कि मुझे यकीन नहीं है कि मैं कक्षा डिजाइन कर रहा हूं।)

जवाबों:


86

मुझे नहीं लगता कि प्रदर्शन समस्याएं या ऐसा कुछ होने की संभावना है यदि आप आयातों को नहीं हटा रहे हैं।

लेकिन सूची इंटरफ़ेस को आयात करने जैसे दुर्लभ मामलों में नामकरण संघर्ष हो सकता है।

ग्रहण में आप हमेशा आयात को व्यवस्थित करने के लिए एक शॉर्टकट (ओएस पर निर्भर करता है - विन: Ctrl + SHIFT + Oऔर मैक :) का उपयोग कर सकते हैं COMMAND + SHIFT + O। ग्रहण तब आयात अनुभाग को साफ कर देता है, सभी बासी आयातों को हटा देता है। यदि आपको किसी आयातित चीज की आवश्यकता है तो फिर से जब आप वक्तव्य पूरा कर रहे हैं तो ग्रहण उन्हें स्वचालित रूप से जोड़ देगा Ctrl + SPACE। इसलिए आपको क्लास में अनुपयोगी कोड रखने की कोई आवश्यकता नहीं है।

जैसा कि हमेशा अनुपयोगी कोड आपको और अन्य लोगों को कोड पढ़ते समय और आपके सक्रिय कोड में कुछ छोड़ने के कारण विचलित कर देगा क्योंकि हो सकता है कि मुझे बाद में इसकी आवश्यकता हो, इसे ज्यादातर बुरे अभ्यास के रूप में देखा जाता है।


22
यह वास्तव में विंडोज़ पर Ctrl + Shift + O है।
मैट बॉल

1
Linux अच्छी तरह से Ctrl + Shift + O। शायद बीएसडी पर भी ऐसा ही हो।
WhyNotHugo

2
इसे प्राप्त करने का एक और तरीका है आयात आयात कार्रवाई ctrl+3(कम से कम विंडवॉस पर क्लिक करके ) और फिर आयात टाइप करना। यह स्पष्ट रूप से धीमा है तो ctrl + shift + O लेकिन इसका जल्दी से पता लगाने का एक तरीका है (और कई अन्य क्रियाएं जो आप या तो रीमाइबर कर रहे हैं या खोजने की कोशिश कर रहे हैं) भले ही आपको इसके लिए विशिष्ट शॉर्टकट याद न हो।
epeleg

53

एक यह होगा कि यदि आप वर्गपथ से आयात द्वारा संदर्भित वर्ग को हटाते हैं, तो आपको एक मूर्ख कंपाइलर त्रुटि नहीं मिलेगी जो इस उद्देश्य को पूरा करती है। और जब आप "जहां उपयोग किया जाता है" खोज करते हैं तो आपको झूठी सकारात्मकता नहीं मिलेगी।

एक और (लेकिन यह प्रकृति में बहुत विशिष्ट होगा) होगा यदि अप्रयुक्त आयात का दूसरे आयात के साथ नामकरण टकराव होता है, जिससे आप पूरी तरह से योग्य नामों का अनावश्यक रूप से उपयोग कर सकते हैं।

परिशिष्ट: आज बिल्ड सर्वर स्मृति त्रुटि के एक संकलन के साथ संकलन (परीक्षण भी नहीं चल रहा है) को विफल करना शुरू कर दिया। यह हमेशा के लिए ठीक चला और चेक-इन में बिल्ड प्रक्रिया या महत्वपूर्ण परिवर्धन में कोई बदलाव नहीं हुआ जो इसे समझा सकते थे। मेमोरी सेटिंग्स बढ़ाने का प्रयास करने के बाद (यह 64 बिट JVM 64 बिट CentOS पर चल रहा है!) जहां ग्राहक संकलित कर सकते हैं, उससे परे कुछ अच्छी तरह से, मैंने एक-एक करके चेकइन की जांच की।

एक अनुचित आयात था जिसे एक डेवलपर ने इस्तेमाल किया था और छोड़ दिया था (उन्होंने वर्ग का उपयोग किया था, इसे ऑटो-आयात किया और फिर एहसास हुआ कि यह एक गलती थी)। उस अप्रयुक्त आयात को एप्लिकेशन के एक अलग टियर में खींचा गया है, जबकि IDE उन्हें अलग करने के लिए कॉन्फ़िगर नहीं किया गया है, निर्माण प्रक्रिया है। यह एकल आयात इतने सारे वर्गों में घसीटा गया है कि कंपाइलर ने क्लासपैथ में संबंधित आश्रित पुस्तकालयों के बिना संकलित करने का प्रयास किया, जिससे यह इतने सारे मुद्दों का कारण बना कि इससे मेमोरी त्रुटि का कारण बना। अप्रयुक्त आयात के कारण होने वाली इस समस्या को हल करने में एक घंटे का समय लगा।


4
@ यिशै, यदि आप एक्लिप्स लुक को सेव एक्शन में इस्तेमाल करते हैं, जो आपके द्वारा सेव किए जाने वाले सोर्स कोड को सामान्य कर सकता है।
Thorbjørn Ravn Andersen

2
@ ईजेपी, हालांकि वे परिणामी बायोटेक को प्रभावित नहीं करते हैं, कंपाइलर को बायटेकोड को समझने के लिए उन्हें हल करने की आवश्यकता है जो इसे बनाने की आवश्यकता है।
यिशै

3
@ ईजेपी, संपूर्ण परिशिष्ट संकलन समय ("बिल्ड सर्वर ने संकलन विफल करना शुरू कर दिया") के बारे में बात कर रहा है।
यिशैई

1
मुझे अभी भी समझ नहीं आया कि अकेले आयात यह सब कैसे कर सकता है?
थोर्बोजर्न रेवन एंडरसन

1
@Yishai क्षमा करें, लेकिन मुझे विश्वास नहीं है। आपने इसे गलत बताया है। आयात का ऐसा कोई प्रभाव नहीं होना चाहिए, जब तक कि वर्ग वास्तव में उपयोग नहीं किया गया था। सभी आयात विवरण यह संकलक को बताता है कि कौन सा वर्ग किस पैकेज में है। कंपाइलर केवल उस वर्ग के बारे में जानकारी टाइप करने की आवश्यकता होने पर निहित संकलन करने का प्रयास करता है।
लोर्न

9

शुद्ध दृष्टिकोण से, कोई भी निर्भरता उत्पाद पर एक "बाधा" है और इस प्रकार बाद में रखरखाव की समस्या पैदा कर सकती है।

उदाहरण के लिए, मान लें कि आपका प्रोग्राम वर्ग com.XYZObjectPool का उपयोग करता है, और यह कि बाद में आप इसका उपयोग नहीं करने का निर्णय लेते हैं लेकिन कभी भी आयात को नहीं हटाते हैं। अगर कोई और व्यक्ति अब org.WVYObjectPool को तत्काल बनाना चाहता है और सिर्फ ObjectPool को संदर्भित करता है, तो उन्हें इसके बारे में कोई चेतावनी नहीं मिलती है जब तक कि कहीं नीचे की रेखा में कोई कास्टिंग समस्या या आमंत्रण समस्या नहीं है।

यह, वैसे, अवास्तविक परिदृश्य नहीं है। हर बार जब आप ग्रहण करते थे तो आपसे पूछते थे कि आप किस एक्स का विशिष्ट संस्करण आयात करना चाहते हैं, और आपने कई पैकेजों में से एक को चुना है, यह एक ऐसा परिदृश्य है जहाँ अगर आपने आयात किया है तो आपको इसके बारे में जाने बिना गलत विकल्प मिल सकता है।

किसी भी तरह से, आप ग्रहण को आपके लिए साफ करने के लिए कह सकते हैं


3

चेतावनी? ग्रहण को अपने लिए स्वचालित रूप से साफ करने के लिए कहें। यही इंटेलीज करता है। यदि यह आपको चेतावनी देने के लिए पर्याप्त स्मार्ट है, तो उन्हें साफ करने के लिए पर्याप्त स्मार्ट होना चाहिए। मैं इसे एक नाग होने से रोकने के लिए और कुछ करने के लिए कहने के लिए एक ग्रहण सेटिंग की तलाश करने की सलाह दूंगा।


4
Thats सहेजें कार्य। व्यक्तिगत रूप से मुझे यह पसंद है कि एक्लिप्स केवल आपके कोड को बदलता है जब आपने स्पष्ट रूप से इसके लिए पूछा है।
Thorbjørn Ravn Andersen

1
@ Thorbjørn: सहमत, खासकर अगर यह एक ऐसा वर्ग है जिसे मैंने थोड़े समय के लिए उपयोग करना बंद कर दिया है, लेकिन मुझे उम्मीद है कि मैं जल्द ही इसे फिर से जोड़ दूंगा।
डोनल फैलो

2
@ डॉनल, वेल, वह जो Ctrl-Space के लिए है।
थोरबजोरन रावन एंडरसन 16

3

यह रखरखाव के लिए उपयोगी कार्यक्रम की स्पष्टता के साथ करना है।

यदि आपको एक कार्यक्रम बनाए रखना था तो आप पाएंगे कि प्रति पंक्ति एक एकल वर्ग आयात करना कितना उपयोगी है।

निम्नलिखित परिदृश्य के बारे में सोचें:

import company.billing.*;
import company.humanrerources.*;

// other imports 


class SomeClass {
      // hundreds or thousands of lines here... 
    public void veryImportantMethod() {
      Customer customer;
      Employee comployee;
      Department dept. 
      // do something with them
     }
 }

जब आप बगफिक्सिंग कर रहे हों या कोड ऑफ पीस (या केवल इसे पढ़ रहे हों) तो पाठक के लिए यह जानना बहुत मददगार होता है कि कौन से पैकेज किस वर्ग के हैं। ऊपर दिखाए गए अनुसार वाइल्डकार्ड आयात का उपयोग उस उद्देश्य के लिए मदद नहीं करता है।

यहां तक ​​कि एक आईडीई के साथ, आप घोषणा और वापसी के लिए मंडराना या कूदना नहीं चाहते हैं, यह आसान है यदि आप कार्यक्षमता के संदर्भ में समझते हैं कि वर्तमान कोड क्या अन्य संकुल और वर्गों पर निर्भर करता है।

यदि यह एक व्यक्तिगत परियोजना या कुछ छोटे के लिए है, तो यह वास्तव में मायने नहीं रखता है, लेकिन कुछ बड़े के लिए जो अन्य डेवलपर्स द्वारा उपयोग किया जाना है (और वर्षों के दौरान बनाए रखा गया) यह एक जरूरी है।

किसी भी प्रदर्शन में कोई अंतर नहीं है।


3

FYI करें, इसने मुझे बाहर कर दिया, क्योंकि मुझे नहीं लगता था कि आयातों का आयोजन वास्तव में अप्रयुक्त आयातों को हटा दिया गया था, मैंने सोचा कि यह सिर्फ उन्हें हल करता है।

सेव ऑपरेशन के दौरान आयात को स्वचालित रूप से हटाने से मुझे कुछ दुःख हुआ जब उदाहरण के लिए, विकास या परीक्षण के दौरान आपको एक समस्या है और कुछ कोड पर टिप्पणी करें, जब आप इसे सहेजते हैं, तो कोड के टिप्पणी वाले अनुभाग द्वारा उपयोग किए गए आयात हटा दिए जाते हैं। कभी-कभी यह एक समस्या नहीं है क्योंकि आप परिवर्तनों को पूर्ववत ( Ctrl+ Z) कर सकते हैं, लेकिन अन्य बार यह इतना सरल नहीं है क्योंकि आपने अन्य परिवर्तन किए होंगे। मुझे एक समस्या यह भी थी कि जब मैंने कोड को अनियंत्रित कर दिया था (मैंने पहले टिप्पणी की थी तब बचाया गया था, इस प्रकार उस कोड के लिए आयात को हटा दिया गया था), इसने स्वचालित रूप से उन आयातों का अनुमान लगाने की कोशिश की जिन्हें जरूरत थी और गलत लोगों को उठाया (जैसे मुझे लगता है कि मुझे लगता है) एक StringUtilsवर्ग इस्तेमाल किया जा रहा था और इसने गलत लाइब्रेरी से उसी नाम के साथ एक और उठाया)।

मैं मैन्युअल रूप से आयातों को व्यवस्थित करना पसंद करता हूं बजाय इसे बचाने के एक क्रिया के रूप में।


2

ग्रहण के लिए मैं इसका उपयोग करता हूं: विंडो -> प्राथमिकताएं -> जावा -> संपादक -> कार्रवाई सहेजें -> संगठित आयात के लिए चेकबॉक्स की जांच करें (वहां बहुत सारे अन्य उपयोगी सामान भी हैं, जैसे स्वरूपण, फ़ील्ड को अंतिम बनाना और इसी तरह। ।)। इसलिए जब मैं अपनी फ़ाइल को सहेजता हूं तो ग्रहण मेरे लिए अशुद्धि आयात को हटा देता है। मेरी राय में, अगर आपको किसी चीज़ की ज़रूरत नहीं है, तो इसे हटा दें (या इसे ग्रहण द्वारा हटा दें)।


2

आप अप्रयुक्त आयात विवरणों पर टिप्पणी कर सकते हैं और चेतावनी आपको परेशान नहीं करेगी लेकिन आप देख सकते हैं कि आपके पास क्या था।


2
@DimaSan वास्तव में यह होता है: सवाल कहता है कि मैं आयात को तब तक नहीं हटाना चाहता जब तक मुझे पूरा यकीन नहीं हो जाता कि मैं कक्षा को डिजाइन कर रहा हूं।
14

1

कोई प्रदर्शन प्रभाव नहीं है, हालांकि पठनीयता के लिए आप इसे साफ कर सकते हैं। अप्रयुक्त आयात को हटाना ग्रहण और IntelliJ IDEA दोनों में काफी सरल है।

ग्रहण

विंडोज / लिनक्स -    Ctrl+ Shift+O

मैक -                        Cmd+ Shift+O

इंटेलीज आईडिया या एंड्रॉइड स्टूडियो

विंडोज / लिनक्स -    Ctrl+ Alt+O

मैक -                        Cmd+ Alt+O


0

मैंने कहीं पढ़ा, कुछ साल पहले, कि हर आयातित वर्ग को रनटाइम पर आयात वर्ग के साथ लोड किया जाएगा। इसलिए अप्रयुक्त, विशेष रूप से पूरे पैकेज को हटाने से मेमोरी ओवरहेड कम हो जाएगी। हालांकि मुझे लगता है कि जावा के आधुनिक संस्करण उसी से निपटते हैं, इसलिए शायद यह अब एक कारण नहीं है।

और वैसे, ग्रहण के साथ आप आयात को व्यवस्थित करने के लिए Ctrl+ Shift+ Oका उपयोग कर सकते हैं , लेकिन आप एक "क्लीनर" को भी कॉन्फ़िगर कर सकते हैं जो इस तरह की चीजों (और कई अन्य) के साथ हर बार जब आप एक जावा फ़ाइल को सहेजते हैं।


हम्म .. मुझे आश्चर्य होगा कि यह व्यवहार था .. मुझे पता है कि कक्षाएं शुरुआती (यानी स्टैटिक इनिशियलाइजर्स को कॉल करने वाली) पहली बार उपयोग करने तक, या जब तक कि वे विशेष रूप से कस्टम लोडर द्वारा अनुरोध नहीं की जाती हैं। लेकिन अगर "लोड" से आपका तात्पर्य है "मेमोरी में पढ़ें, लेकिन संसाधित नहीं" तो यह संभव है, हालांकि मुझे संदेह है।
किप

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

4
पृथ्वी पर आपने कहाँ पढ़ा? यह पूरी तरह से और पूरी तरह से गलत है, और हमेशा रहा है। कोड द्वारा संदर्भित हर वर्ग को लोड किया जाएगा, कि आयात सहित।
लोर्न

0

मेरे लिए, नियंत्रक वर्ग में एक अप्रयुक्त श्रेणी के आयात ने कोड क्लीनअप के दौरान आयातित वर्ग को हटाने के बाद जेनकिन्स बिल्ड में एक संकलन समस्या पैदा की और स्थानीय में एक निर्माण का परीक्षण किए बिना गिट में विलोपन को प्रतिबद्ध किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.