2009-10-12 12 views
15

जावा में हम या तो एकल कक्षाओं के साथ-साथ कक्षाओं के पूरे सेट (एक पैकेज) आयात कर सकते हैं।जावा में कक्षा आयात और पैकेज आयात के बीच कोई अंतर?

एक उदाहरण के रूप

import java.util.* 

import java.util.ArrayList; 
import java.util.Date; 
import java.util.Enumeration; 
import java.util.HashSet; 
import java.util.Hashtable; 
import java.util.List; 
import java.util.Iterator; 
import java.util.Map; 

कोड की लंबाई के अलावा भी शामिल है, वहाँ किसी भी तरीके से एक दृष्टिकोण का उपयोग कर के किसी भी विशिष्ट लाभ हैं? स्मृति आवंटन? प्रदर्शन?

+0

मैं बस यह पूछने वाला था। धन्यवाद! –

उत्तर

26

या तो कोई प्रदर्शन या स्मृति आवंटन लाभ नहीं है - वे दोनों एक ही बाइटकोड को संकलित करेंगे।

import कथन कंपाइलर को कहने के लिए है कि स्रोत कोड का संदर्भ देने वाले वर्गों को कहां ढूंढना है।

हालांकि, केवल कक्षाओं द्वारा आयात करने का एक फायदा है। यदि दो पैकेजों में एक ही नाम के साथ एक वर्ग है, तो इस बात का एक संघर्ष होगा कि किस वर्ग को संदर्भित किया जा रहा है।

ऐसा एक उदाहरण java.awt.List वर्ग और java.util.List वर्ग है।

मान लें कि हम java.awt.Panel और java.util.List का उपयोग करना चाहते हैं।स्रोत संकुल का आयात करता है, तो इस प्रकार है:

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

फिर, List वर्ग की चर्चा करते हुए ambigious होने जा रहा है:

List list; // Which "List" is this from? java.util? java.awt? 

हालांकि, अगर एक स्पष्ट रूप से आयात करता है, तो परिणाम होगा:

import java.awt.Panel; 
import java.util.List; 

List list; // No ambiguity here -- it refers to java.util.List. 
+1

अच्छा बिंदु। फिर सूची के साथ कोड संकलित करते समय संकलक एक संकलन त्रुटि रिपोर्ट करता है? –

+0

हां, संकलक आपको एक त्रुटि के साथ बताएगा कि नाम 'सूची' अस्पष्ट है। – Jesper

+1

एनबी आप अभी भी पूरे पैकेज को आयात कर सकते हैं, फिर व्यक्तिगत कक्षाओं के आयात को ओवरराइड कर सकते हैं। दूसरे शब्दों में, आप अभी भी java.awt आयात कर सकते हैं। * फिर java.util.List आयात करें। –

2

आपके आवेदन के लिए स्मृति आवंटन या प्रदर्शन में कोई अंतर नहीं है; आयात विवरणों पर आपके प्रोग्राम पर रनटाइम पर कोई प्रभाव नहीं पड़ता है। वे संकलक को बताने के निर्देश हैं जहां कक्षाओं को खोजने के लिए (पैकेज में)।

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

मान लीजिए कि आप अपने प्रोग्राम में कुछ लाइब्रेरी के संस्करण 1.0 का उपयोग कर रहे हैं, और आप import somelibrary.*; करते हैं। मान लें कि आपके प्रोग्राम में X नामक एक कक्षा है। अब, लाइब्रेरी का संस्करण 1.1 बाहर आता है और आप इसका उपयोग करना चाहते हैं। मान लीजिए कि लाइब्रेरी के संस्करण 1.1 में X नामक एक नई कक्षा है।

यदि आपने वाइल्डकार्ड वाक्यविन्यास का उपयोग किया है, तो आप अचानक लाइब्रेरी से X आयात भी कर रहे हैं। संकलक तब आपको एक त्रुटि देगा, क्योंकि आपके प्रोग्राम में पहले से ही X कक्षा है, और संकलक लाइब्रेरी से आपके X और X के बीच अंतर नहीं कर सकता है।

यदि आप केवल उन पुस्तकालयों को आयात करते हैं जिन्हें आपको वास्तव में लाइब्रेरी से चाहिए, तो आपको यह समस्या नहीं मिलती है, क्योंकि आप लाइब्रेरी के संस्करण 1.1 से स्वचालित रूप से X आयात नहीं करेंगे।

6

आपके द्वारा उपयोग किए जाने वाले आयात केवल कक्षा के नामों को हल करते समय संकलन-समय अंतर बनाते हैं।

तो पठनीयता पर केवल फायदे/नुकसान लागू होते हैं।

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

2

एक स्पष्ट आयात करना संकलन समय पर सुरक्षित है, क्योंकि कक्षा संघर्ष की कोई संभावना नहीं है। जैसे

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

आप एक तिथि वर्ग का उपयोग करने की कोशिश कर रहे हैं एक समस्या का कारण बनता है (जो पैकेज? से अर्थात्)।

लेकिन इसके अलावा, कोई प्रदर्शन या स्मृति पहलू नहीं है। यह पूरी तरह से एक संकलन समय मुद्दा है।

2

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

का उपयोग कर आयात करने का नुकसान '*' हैं:

  • आप कभी-कभी आयात किए जाते वर्ग के नाम टक्कर; जैसे जब विभिन्न वर्गों में कक्षाओं के लिए कुछ वर्ग नाम का उपयोग किया जाता है और आप दोनों को आयात करते हैं।
  • आप आयात को देखकर कक्षाओं को स्पष्ट निर्भरता नहीं देख सकते हैं। लेकिन यह कम महत्वपूर्ण है यदि आपका आईडीई आपको कुछ अन्य तरीकों से निर्भरता दिखा सकता है।
0

कोई भी सभ्य आईडीई आपके लिए आयात विवरण में और बहुत कुछ के अलावा रखेगा। यदि यह आपके लिए एक मुद्दा है तो बेहतर आईडीई प्राप्त करें।

इंटेलिजे यह करता है; तो ग्रहण करता है। मैं खुद नेटबीन का उपयोग नहीं करता, लेकिन मैं शर्त लगाता हूं कि यह करता है।

संबंधित मुद्दे