जावा आयात स्टेटमेंट के साथ वाइल्ड कार्ड का उपयोग क्यों बुरा है?


419

यह एकल कथन का उपयोग करने के लिए बहुत अधिक सुविधाजनक और क्लीनर है

import java.awt.*;

व्यक्तिगत वर्गों का एक समूह आयात करने की तुलना में

import java.awt.Panel;
import java.awt.Graphics;
import java.awt.Canvas;
...

importबयान में वाइल्डकार्ड का उपयोग करने में क्या गलत है ?

जवाबों:


518

इसके साथ एकमात्र समस्या यह है कि यह आपके स्थानीय नामस्थान को बंद कर देता है। उदाहरण के लिए, मान लें कि आप एक स्विंग ऐप लिख रहे हैं, और इसलिए आवश्यकता है java.awt.Event, और कंपनी के कैलेंडरिंग सिस्टम के साथ भी हस्तक्षेप कर रहे हैं, जिसमें है com.mycompany.calendar.Event। यदि आप वाइल्डकार्ड विधि का उपयोग करके दोनों को आयात करते हैं, तो इन तीन चीजों में से एक होता है:

  1. आप के बीच एक सिरे से नामकरण विरोध होता है java.awt.Eventऔर com.mycompany.calendar.Event, इसलिए आपको यह भी संकलन नहीं कर सकते।
  2. आप वास्तव में केवल एक आयात करने के लिए प्रबंधित करते हैं (केवल आपके दो आयातों में से एक करता है .*), लेकिन यह गलत है, और आप यह पता लगाने के लिए संघर्ष करते हैं कि आपका कोड क्यों दावा कर रहा है कि यह गलत है।
  3. जब आप अपना कोड संकलित करते हैं तो कोई भी नहीं होता है com.mycompany.calendar.Event, लेकिन जब वे बाद में एक जोड़ते हैं तो आपका पहले वाला वैध कोड अचानक संकलन बंद हो जाता है।

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


7
यह पहला परिदृश्य है जो होगा। संकलक ने नोटिस किया कि दो ईवेंट क्लासेस हैं और एक त्रुटि देता है।
जन.दबर्बग सिप

38
नीचे मेरी टिप्पणी की जाँच करना सुनिश्चित करें - समय के साथ तीसरे पक्ष के लिबास में जोड़े जा रहे प्रकारों के साथ एक बड़ा मुद्दा है। आपके पास संकलित कोड हो सकता है जो आपके द्वारा निर्भर किसी जार में एक प्रकार जोड़ने के बाद संकलन बंद कर देता है।
स्कॉट स्टैनफील्डफील्ड

6
समस्या 1 के बारे में: तकनीकी रूप से, आप संकलन कर सकते हैं, लेकिन आपको हर बार पूरी तरह से योग्य वर्ग नाम का उपयोग करना होगा।
किप

1
आप प्रत्येक वर्ग को स्पष्ट रूप से सूचीबद्ध किए बिना इस तरह के संघर्षों को हल कर सकते हैं, जो स्वयं की समस्याओं का कारण बनता है।
rjjohnst

196

यहाँ स्टार आयात के लिए एक वोट है । एक आयात स्टेटमेंट का उद्देश्य पैकेज को आयात करना है , न कि क्लास को। पूरे पैकेज को आयात करने के लिए यह बहुत साफ है; यहाँ पहचाने गए मुद्दे (जैसे java.sql.Dateबनाम java.util.Date) को अन्य माध्यमों द्वारा आसानी से हटा दिया जाता है, वास्तव में विशिष्ट आयातों द्वारा संबोधित नहीं किया जाता है और निश्चित रूप से सभी वर्गों पर पागलपन भरे आयात को उचित नहीं ठहराता है। स्रोत फ़ाइल खोलने और 100 आयात विवरणों के माध्यम से पृष्ठ पर आने से अधिक निराशाजनक कुछ भी नहीं है।

विशिष्ट आयात करने से रिफैक्टरिंग अधिक कठिन हो जाता है; यदि आप किसी वर्ग को हटाते हैं / उसका नाम बदलते हैं, तो आपको उसके सभी विशिष्ट आयातों को हटाने की आवश्यकता है । यदि आप एक कार्यान्वयन को एक ही पैकेज में एक अलग वर्ग में बदलते हैं, तो आपको आयात ठीक करना होगा। हालांकि इन अतिरिक्त चरणों को स्वचालित किया जा सकता है, वे वास्तव में बिना किसी वास्तविक लाभ के उत्पादकता हिट हैं।

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

यहाँ वर्ग संघर्षों से निपटने के तरीके दिए गए हैं:

import java.sql.*;
import java.util.*;
import java.sql.Date;

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

32
देखें javadude.com/articles/importondemandisevil.html जानकारी के लिए कारण है कि यह बुराई है। मूल विचार: यह तब कोडिंग को रोकने के लिए कोड का कारण बन सकता है जब कक्षाएं आपके द्वारा आयात किए जाने वाले पैकेजों में जोड़ी जाती हैं (जैसे कि जब सूची java.util में जोड़ी गई थी ...)
स्कॉट स्टैनफील्ड

61
आपके द्वारा उल्लिखित सभी समस्याओं को आधुनिक आईडीई (आयात छिपाते हुए, वर्ग नाम रिफैक्टिंग, आदि ...) द्वारा हल किया जा सकता है।
assylias

15
स्रोत कोड को पढ़ने या लिखने के लिए मुझे एक IDE का उपयोग नहीं करना चाहिए - कोड को विशेष उपकरणों के बिना अपने दम पर पठनीय होना चाहिए जब तक कि भाषा अविश्वसनीय रूप से ब्रिंडेड न हो। इस मामले में, जावा महान काम करता है - बस स्टार आयात का उपयोग करें। कोई कारण नहीं है।
davetron5000

42
@ davetron5000 यदि आपके कोड में 10+ वाइल्डकार्ड आयात शामिल हैं, और आप वर्ग का उपयोग करते हैं Foo, और अगर मैं बिना आईडीई का उपयोग किए बिना आपका कोड पढ़ता हूं (चूंकि आपका तर्क है कि मुझे एक का उपयोग नहीं करना चाहिए), तो मुझे कैसे पता चलेगा कि कौन सा पैकेज Fooआया ? निश्चित रूप से, एक आईडीई का उपयोग करते हुए, आईडीई मुझे बताएगा, लेकिन आपका पूरा तर्क यह है कि मुझे एक के बिना कोड पढ़ने में सक्षम होना चाहिए । स्पष्ट आयात करने से कोड (वाइल्डकार्ड से बचने का बहुत बड़ा कारण) को दस्तावेज़ में मदद मिलती है , और यह बहुत अधिक संभावना है कि मैं आईडीई का उपयोग किए बिना कोड पढ़ रहा हूं, इससे अधिक मैं आईडीई का उपयोग किए बिना कोड लिख रहा हूं ।
एंड्रियास

169

कृपया मेरे लेख देखें डिमांड पर आयात बुराई है

संक्षेप में, सबसे बड़ी समस्या यह है कि आपका कोड तब टूट सकता है जब कोई वर्ग आपके द्वारा आयात किए गए पैकेज में जोड़ा जाता है। उदाहरण के लिए:

import java.awt.*;
import java.util.*;

// ...

List list;

जावा 1.1 में, यह ठीक था; Java.awt में सूची मिली और कोई विरोध नहीं हुआ।

अब मान लीजिए कि आप अपने पूरी तरह से काम कर रहे कोड में जांच करते हैं, और एक साल बाद कोई और इसे संपादित करने के लिए बाहर लाता है, और जावा 1.2 का उपयोग कर रहा है।

जावा 1.2 ने java.util के लिए सूची नाम का एक इंटरफ़ेस जोड़ा। बूम! संघर्ष। पूरी तरह से काम करने वाला कोड अब काम नहीं करता है।

यह एक EVIL लैंग्वेज फीचर है। नहीं है कोई कारण यह है कि कोड संकलन सिर्फ इसलिए कि एक प्रकार है बंद कर देना चाहिए जोड़ा एक पैकेज के लिए ...

इसके अलावा, यह एक पाठक के लिए यह निर्धारित करना मुश्किल बनाता है कि आप किस "फू" का उपयोग कर रहे हैं।


35
यह एक वैध बहाना नहीं है। यदि आप जावा संस्करण बदल रहे हैं तो आप किसी तरह से कुछ चीजों के असफल होने की उम्मीद करते हैं, यदि आप एक द्विआधारी का संस्करण बदलते हैं जो आपके कोड उपयोग करता है। इन मामलों में कोड एक संकलित त्रुटि को फेंक देगा और इसे ठीक करने के लिए तुच्छ होगा (पिछले उत्तर देखें: stackoverflow.com/a/149282/7595 )
पाब्लो फर्नांडीज

36
@PabloFernandez - Nope - अगर मैं एक वर्ष के लिए भंडार में रहे कोड की जांच करता हूं, तो उसे संकलन करना चाहिए। आयात-ऑन-डिमांड आसानी से विफल हो सकता है जब मेरे द्वारा आयात किए गए मौजूदा पैकेजों में नई कक्षाएं जोड़ी जाती हैं । जावा संस्करणों को अपग्रेड करते समय यह केवल एक समस्या नहीं है। इसके अलावा - यदि एक एपीआई को अच्छी तरह से डिज़ाइन किया गया है, तो उसे अपग्रेड पर मौजूदा कोड को कभी नहीं तोड़ना चाहिए । जावा संस्करण को अपग्रेड करते समय मुझे केवल कोड बदलने की आवश्यकता थी क्योंकि आयात-ऑन-डिमांड के कारण और जब सूर्य ने XML एपीआई को जावा रनटाइम में खींच लिया था।
स्कॉट स्टैनफील्ड

3
क्लासपाथ में एक वर्ग (एक अद्वितीय, पूरी तरह से योग्य नाम के साथ!) जोड़ना कुछ भी प्रभावित नहीं करना चाहिए। यहाँ मुद्दा यह है कि अगर आप do -not सिंटैक्स-ऑन-डिमांड सिंटैक्स का उपयोग नहीं करते हैं, तो यह नहीं होगा। इसलिए उस बुरे सिंटैक्स का उपयोग न करें जिसे भाषा दुर्भाग्य से अनुमति देती है और यह एक बहुत ही वास्तविक समस्या है जिससे आप टकरा सकते हैं।
स्कॉट स्टैनफील्ड

28
मेरे उत्तर की बात यह है कि यह एक अनावश्यक भाषा विशेषता है जो समस्याओं का कारण बनती है। कई आईडीई / संपादक स्वचालित रूप से आयात विस्तार को संभालते हैं। पूरी तरह से योग्य आयात का उपयोग करें और इस विशेष त्रुटि होने का कोई मौका नहीं है। मौजूदा कोड में बग को ठीक करने के लिए दबाव में आने पर मैं इससे एक बार टकरा गया हूं, और आपको वास्तव में इस तरह की जरूरत नहीं है जैसे कि हाथ में वास्तविक कार्य से एक व्याकुलता। java.util.Listबनाम java.awt.Listयह पता लगाने के लिए बहुत बुरा नहीं है, लेकिन इसे तब आजमाएं जब वर्ग का नाम हो Configurationऔर कई निर्भरता पुस्तकालयों ने इसे अपने नवीनतम मावेन रेपो संस्करण में जोड़ा हो।
स्कॉट स्टैनफील्ड

5
अगर मैं एक जार को अपडेट करता हूं जहां मैं जिन कक्षाओं का उपयोग करता हूं वे एपीआई-फॉरवर्ड संगत हैं, और मैं आयात-ऑन-डिमांड सिंटैक्स का उपयोग नहीं करता हूं, तो यह मुझे बिल्कुल प्रभावित नहीं करेगा। क्या इससे आपको कोई मतलब है? आयातों को परिभाषित करने में आलस्य न करें और यह एक गैर-मुद्दा है। आयात-ऑन-डिमांड सिंटैक्स जावा भाषा की परिभाषा में एक गलती थी; एक उचित भाषा को इस तरह की त्रुटियों की अनुमति नहीं देनी चाहिए।
स्कॉट स्टैनफिल्ड

67

यह नहीं एक जावा आयात बयान के साथ वाइल्ड कार्ड का उपयोग करने के बुरा।

में स्वच्छ कोड , रॉबर्ट सी मार्टिन वास्तव में उन्हें उपयोग करने की सलाह लंबे आयात सूचियों से बचने के लिए।

यहाँ सिफारिश है:

J1: वाइल्डकार्ड का उपयोग करके लंबी आयात सूची से बचें

यदि आप पैकेज से दो या अधिक वर्गों का उपयोग करते हैं, तो पूरे पैकेज को आयात करें

आयात पैकेज। *;

आयात की लंबी सूची पाठक के लिए कठिन होती है। हम आयात की 80 लाइनों के साथ अपने मॉड्यूल के शीर्ष को अव्यवस्थित करना नहीं चाहते हैं। इसके बजाय हम चाहते हैं कि आयात एक संक्षिप्त विवरण हो कि हम किन पैकेजों के साथ सहयोग करते हैं।

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

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

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


41
मैं रॉबर्ट सी। मार्टिन को सुझाव दूंगा कि वे अधिक संक्षिप्त पैकेज और अपनी खुद की कक्षाएं बनाने के लिए बेहतर पैटर्न का उपयोग करें जिन्हें आयात की 80 लाइनों की आवश्यकता नहीं है। एक एकल वर्ग के अंदर आयात के लिए आवश्यक कई कक्षाएं सिर्फ 'एंट्रॉपी, एन्ट्रॉपी, मुझे तोड़ने की कृपा कर रही हैं ...' और स्कॉट स्टैन्चफिल्ड एवर्स में उल्लिखित * आयात से बचने का कारण बताते हैं
रे

28
जैसा कि मैं आमतौर पर प्यार करता हूं कि अंकल बॉब को क्या कहना है, इस मामले में मुझे भी उनसे असहमत होना होगा।

33
आयात की लंबी सूचियाँ पाठक के लिए कठिन हैं। - इस दावे में एक अमान्य अनुमान है। प्रोग्रामर को स्रोत कोड को ऊपर से नीचे पढ़ने की आवश्यकता नहीं है। हम आयात सूचियों को बिल्कुल नहीं पढ़ सकते हैं। जब हम करते हैं, हम स्पष्टीकरण के लिए केवल एक आयात पढ़ सकते हैं। यदि हम एक IDE में काम कर रहे हैं, तो अन्य समय में, आयात पूरी तरह से ध्वस्त हो सकता है। स्रोत के बावजूद, आज यह बुरी सलाह है।
एंडी थॉमस

10
इस मुद्दे पर अधिकारियों का हवाला देते हुए बस कुछ जवाबी प्रदान करने के लिए: Google जावा स्टाइल गाइड के साथ-साथ ट्विटर के जावा स्टाइल गाइड (जो काफी हद तक Google पर आधारित है, निष्पक्ष होने के लिए) विशेष रूप से वाइल्डकार्ड आयात को मना करते हैं। लेकिन वे इस निर्णय के लिए कोई तर्क नहीं देते हैं।
11

1
संभवतः एकमात्र बिंदु जो मैं क्लीन कोड में सहमत नहीं था। यह आयात विवरणों की कुछ पंक्तियों के माध्यम से स्क्रॉल करने या यह पता लगाने के लिए संघर्ष कर रहा है कि वर्ग कहां से आ रहा है। मैं आसानी से पहचान करना पसंद करता हूं कि एक निश्चित वर्ग कहां से आ रहा है।
गणेश सतपुत

27

प्रदर्शन : बाइट कोड के रूप में प्रदर्शन पर कोई प्रभाव नहीं है। हालांकि यह कुछ संकलन ओवरहेड्स को जन्म देगा।

संकलन : मेरी निजी मशीन पर, बिना किसी आयात के किसी रिक्त वर्ग को संकलित करने पर जावा को आयात करते समय 100 मि।


3
import java.*आयात कुछ नहीं। इससे फर्क क्यों पड़ेगा?
लोर्ने

6
इससे फर्क पड़ता है क्योंकि संकलन के दौरान इसे खोजा जाता है।
लीजेंडलेंथ

25

यह आपके नामस्थान को बंद कर देता है, जिससे आपको अस्पष्ट रूप से किसी भी वर्गनाम को पूरी तरह से निर्दिष्ट करने की आवश्यकता होती है। इसके साथ सबसे आम घटना है:

import java.util.*;
import java.awt.*;

...
List blah; // Ambiguous, needs to be qualified.

यह आपकी निर्भरता को ठोस बनाने में भी मदद करता है, क्योंकि आपकी सभी निर्भरताएं फ़ाइल के शीर्ष पर सूचीबद्ध हैं।


20
  1. यह क्लासनेम संघर्षों की पहचान करने में मदद करता है: अलग-अलग पैकेजों में दो कक्षाएं जिनका एक ही नाम है। यह * आयात के साथ मास्क किया जा सकता है।
  2. यह निर्भरता को स्पष्ट करता है, ताकि जिस किसी को भी आपके कोड को पढ़ना है, उसे बाद में पता चले कि आपको आयात करने का क्या मतलब है और आपको आयात करने का क्या मतलब नहीं है।
  3. यह कुछ संकलन को तेजी से बना सकता है क्योंकि कंपाइलर को अवसादों की पहचान करने के लिए पूरे पैकेज की खोज करने की आवश्यकता नहीं है, हालांकि यह आमतौर पर आधुनिक संकलक के साथ एक बड़ा सौदा नहीं है।
  4. स्पष्ट आयात के असुविधाजनक पहलुओं को आधुनिक आईडीई के साथ कम से कम किया जाता है। अधिकांश आईडीई आपको आयात अनुभाग को ध्वस्त करने की अनुमति देते हैं, इसलिए यह उस तरह से नहीं है, जब जरूरत पड़ने पर स्वचालित रूप से आयात करें, और उन्हें साफ करने में मदद करने के लिए अप्रयुक्त आयात की पहचान करें।

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


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

हो सकता है कि इस समस्या का एक हिस्सा यह है कि जिस तरह से मानक जावा पुस्तकालयों को एक ही पैकेज में कई वर्गों के साथ रखा गया है। एक पैकेज में 'एकल प्रतिक्रिया सिद्धांत' के अधिक लागू करने का विरोध किया।
लीजेंडलॉग्रफी

11

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


9

पिछले प्रोजेक्ट में मैंने पाया कि * -मपोर्ट्स से विशिष्ट आयातों में बदलाव ने संकलन समय को आधे से कम कर दिया (लगभग 10 मिनट से लगभग 5 मिनट तक)। * -Import कंपाइलर को आपके द्वारा उपयोग किए जाने वाले वर्ग से मेल खाते प्रत्येक वर्ग के लिए सूचीबद्ध बनाता है। जबकि यह समय छोटा हो सकता है, यह बड़ी परियोजनाओं के लिए जोड़ता है।

* -पोर्ट का एक पक्ष प्रभाव यह था कि डेवलपर्स आम आयात लाइनों को कॉपी और पेस्ट करते थे, बजाय इसके कि वे क्या सोचते हैं।


11
रहा होगा एक बहुत आयात लाइनों या एक से वास्तव में दयनीय इस के लिए विकास प्रणाली सच होना। मैं आयात का उपयोग करता हूं- * मैं एक 2 मिनट के भीतर 2107 कक्षाओं के अपने पूरे कोडबेस को संकलित कर सकता हूं ।
लॉरेंस Dol

6

में DDD किताब

जिस भी विकास तकनीक में कार्यान्वयन आधारित होगा, वह MODULES को फिर से भरने के काम को कम करने के तरीकों की तलाश करेगा। जावा में, व्यक्तिगत वर्गों में आयात करने से कोई बच नहीं सकता है, लेकिन आप एक समय में पूरे पैकेज को कम से कम आयात कर सकते हैं, इस इरादे को दर्शाते हैं कि पैकेज नाम बदलने के प्रयास को कम करते हुए पैकेज अत्यधिक एकजुट इकाइयां हैं।

और अगर यह स्थानीय नाम स्थान को बंद कर देता है तो यह आपकी गलती नहीं है - पैकेज के आकार को दोष दें।


3
  • कोई रनटाइम प्रभाव नहीं है, क्योंकि संकलक स्वचालित रूप से * को ठोस वर्ग नामों के साथ बदल देता है। यदि आप .class फ़ाइल को विघटित करते हैं, तो आप कभी नहीं देखेंगे import ...*

  • C # हमेशा उपयोग करता है (स्पष्ट रूप से) क्योंकि आप केवल usingनाम का पैकेज कर सकते हैं । आप कभी भी कक्षा का नाम निर्दिष्ट नहीं कर सकते। जावा c # के बाद फीचर का परिचय देता है। (जावा कई पहलुओं में इतना पेचीदा है लेकिन यह इस विषय से परे है)।

  • Intellij Idea में जब आप "import Organize" करते हैं, तो यह अपने आप एक ही पैकेज के कई आयात * की जगह ले लेता है। यह एक अनिवार्य विशेषता है क्योंकि आप इसे बंद नहीं कर सकते (हालांकि आप सीमा बढ़ा सकते हैं)।

  • स्वीकृत उत्तर द्वारा सूचीबद्ध मामला मान्य नहीं है। बिना * आप अभी भी एक ही मुद्दा है। आपको अपने कोड में pakcage का नाम निर्दिष्ट करने की आवश्यकता है, चाहे आप * या नहीं का उपयोग करें।


1
IntelliJ में, यह एक अनिवार्य विशेषता नहीं है और इसे बंद किया जा सकता है।
बस्तिन।

3

रिकॉर्ड के लिए: जब आप एक आयात जोड़ते हैं, तो आप अपनी निर्भरता का भी संकेत दे रहे हैं।

आप जल्दी से देख सकते हैं कि फ़ाइलों की निर्भरता क्या है (समान नामस्थान की कक्षाओं को छोड़कर)।


इस बात से सहमत। प्रेरक इतना प्रदर्शन या संकलन नहीं है, लेकिन आपके कोड की मानव पठनीयता है। उदाहरण के लिए GitHub पर बस कल्पना कीजिए कि आप बिना IDE के कोड पढ़ रहे हैं। अचानक आपके द्वारा पढ़ी जा रही फ़ाइल में परिभाषित हर संदर्भ को देखना मन-क्रमिक रूप से कठिन हो जाता है।
लियो ओरिएंटिस

2

सबसे महत्वपूर्ण यह है कि आयात java.awt.*आपके प्रोग्राम को भविष्य के जावा संस्करण के साथ असंगत बना सकता है:

मान लीजिए कि आपके पास "एबीसी" नामक एक वर्ग है, आप जेडडीके 8 का उपयोग कर रहे हैं और आप आयात करते हैं java.util.*। अब, मान लीजिए कि जावा 9 बाहर आता है, और इसमें एक नया वर्ग है java.utilजो संयोग से "एबीसी" कहलाता है। आपका प्रोग्राम अब जावा 9 पर संकलित नहीं होगा, क्योंकि संकलक को यह नहीं पता है कि "एबीसी" नाम के साथ आपका मतलब है कि आपकी अपनी कक्षा या नई कक्षा है java.awt

जब आप केवल उन वर्गों को स्पष्ट रूप से आयात करते हैं java.awtजिनसे आपको वास्तव में उपयोग होता है, तो आपको वह समस्या नहीं होगी ।

संसाधन:

जावा आयात


3
टिप: आप Streamजावा में जावा में जोड़े गए एक नए वर्ग के उदाहरण के रूप में इस्तेमाल कर सकते हैं। 8 जावा में ...
क्लिंट ईस्टवुड

2

दोनों पक्षों पर किए गए सभी मान्य बिंदुओं के बीच मुझे वाइल्डकार्ड से बचने का मेरा मुख्य कारण नहीं मिला है: मुझे कोड पढ़ना और सीधे यह जानना पसंद है कि हर वर्ग क्या है, या अगर इसकी परिभाषा भाषा में नहीं है या फ़ाइल, जहां इसे खोजने के लिए। यदि एक से अधिक पैकेज * के साथ आयात किया जाता है, तो मुझे उन सभी में से एक को खोजना होगा जो मुझे नहीं पहचानता है। पठनीयता सर्वोच्च है, और मैं मानता हूं कि कोड को इसे पढ़ने के लिए आईडीई की आवश्यकता नहीं होनी चाहिए ।


यदि आप इसे अपने पूर्ण तार्किक निष्कर्ष पर ले जाते हैं, तो आपकी शैली को आयातों का उपयोग नहीं करना चाहिए और "नए लिंक्डलिस्ट" के बजाय हमेशा "नए java.util.LinkedList" का उपयोग करें और हर जगह लगातार ऐसा करें ।
इरविन स्मॉउट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.