2010-01-17 11 views
73

कहें कि मेरे पास एक कोड है:एक ही नाम के साथ दो कक्षाओं को आयात करना। कैसे नियंत्रण करे?

import java.util.Date; 
import my.own.Date; 

class Test{ 

    public static void main(String [] args){ 

    // I want to choose my.own.Date here. How? 
    .. 
    // I want to choose util.Date here. How ? 

    } 
} 

क्या मुझे पूर्ण योग्य श्रेणी के नाम होना चाहिए? क्या मैं आयात बयान से छुटकारा पा सकता हूं? असली दुनिया प्रोग्रामिंग में ऐसा परिदृश्य आम है?

+0

नहीं वास्तव में करने के लिए एक जवाब आपका प्रश्न लेकिन सी # में आप किसी भी नामस्थान के लिए उपनाम का उपयोग कर सकते हैं। यह सिंटैक्टिक चीनी हो सकता है लेकिन यह वास्तव में सहायक है: http://msdn.microsoft.com/en-us/library/7f38zh8x.aspx – borjab

उत्तर

108

आप आयात विवरण छोड़ सकते हैं और पूरे पथ का उपयोग करके उन्हें संदर्भित कर सकते हैं। उदाहरण के लिए:

java.util.Date javaDate = new java.util.Date() 
my.own.Date myDate = new my.own.Date(); 

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

+1

यदि आप एक्लिप्स का उपयोग कर रहे हैं, तो आप ' ctrl + shift + r का उपयोग कर your.own.Date'। यह स्वचालित रूप से इसे आपके कोड में संदर्भित करेगा, साथ ही फ़ाइल (और फ़ाइल नाम) में आपके/date/date.java में भी। किसी भी अन्य आईडीई में शायद एक समान सुविधा है। – MatrixFrog

+12

मैं अंतिम बयान से सहमत नहीं हूं। यदि आप अपनी तिथि श्रेणी तैयार करना चाहते हैं, तो 'तिथि' सही नाम है। आप इसे अपने अधिकांश कोड में उपयोग करेंगे। हालांकि, कभी-कभी आपको 'java.util.Date' को कॉल करने की आवश्यकता होगी, विशेष रूप से दोनों के बीच रूपांतरण करने के लिए। – paradigmatic

+1

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

15

कक्षा आयात करने के बजाय पूरी तरह से योग्य नाम का उपयोग करें।

उदा।

//import java.util.Date; //delete this 
//import my.own.Date; 

class Test{ 

    public static void main(String [] args){ 

     // I want to choose my.own.Date here. How? 
     my.own.Date myDate = new my.own.Date(); 

     // I want to choose util.Date here. How ? 
     java.util.Date javaDate = new java.util.Date(); 
    } 
} 
+6

सर्वश्रेष्ठ अभ्यास क्लासपाथ – Alpaslan

7

हां, जब आप समान सरल नामों के साथ कक्षाएं आयात करते हैं, तो आपको उन्हें अपने पूर्ण योग्य वर्ग नामों से संदर्भित करना होगा। मैं आयात विवरणों को छोड़ दूंगा, क्योंकि यह अन्य डेवलपर्स को फ़ाइल में क्या होता है जब वे इसके साथ काम कर रहे हैं।

java.util.Data date1 = new java.util.Date(); 
my.own.Date date2 = new my.own.Date(); 
2

यह परिदृश्य असली दुनिया प्रोग्रामिंग में इतना आम नहीं है, लेकिन यह भी अजीब नहीं है। कभी-कभी ऐसा होता है कि अलग-अलग पैकेजों में दो वर्गों का एक ही नाम होता है और हमें दोनों की आवश्यकता होती है।

यह अनिवार्य नहीं है कि यदि दो वर्गों का एक ही नाम है, तो दोनों में समान कार्यशीलताएं होंगी और हमें उनमें से केवल एक ही चुनना चाहिए।

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

लेकिन हमें कक्षाओं के पूर्ण योग्य नामों का उपयोग करना चाहिए (जिसका नाम समान है) ताकि यह स्पष्ट किया जा सके कि हम किस वर्ग का जिक्र कर रहे हैं।

:)

2

आप इसे के रूप में दिनांक वर्ग में बनाया भेद चाहिए आप अपनी स्वयं की तिथि वर्ग है। यानी आपने अपना खुद का क्यों बनाया। ImmutableDate या BetterDate या नैनोडेट की तरह कुछ, यहां तक ​​कि माईडेट यह इंगित करेगा कि आपकी अपनी तिथि कक्षा क्यों है। इस मामले में, उनके पास एक अद्वितीय नाम होगा।

6

यह करने के लिए एक और तरीका है यह उपवर्ग है:

package my.own; 

public class FQNDate extends Date { 

} 

और फिर संकुल java.util.Date है कि में my.own.FQNDate आयात करते हैं।

+0

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

+0

मैं यह वही करता हूं जब मैं उसी वर्ग में हैमक्रिस्ट 'मैचर्स' और मॉकिटो 'मटरर्स' का उपयोग करना चाहता हूं। ऐसा लगता है कि स्थिर तरीकों से काम करना प्रतीत होता है। – Kidburla

+0

@ किडबर्ला आप स्थिर आयात का भी उपयोग कर सकते हैं जब तक आपको परवाह नहीं है कि कौन सा मैचर कहाँ से आता है। मैं अक्सर इसे मैचर्स के लिए यूनिट परीक्षणों में करता हूं और '। फिर,' .थ्रेटर्न इत्यादि - 'मॉकिटो' ब्लोट को हटा देता है। – CptBartender

2

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

पूरी तरह योग्यता एक तरीका है। ऐसा प्रतीत होता है कि आप वास्तव में दोनों आयात विवरणों को शामिल नहीं कर सकते हैं, क्योंकि जावा चिंतित है कि "व्यक्ति" का अर्थ उदाहरण के लिए है।

2

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

उदाहरण के लिए:

import java.util.Date; 

class Test{ 

    public static void main(String [] args){ 

    // your own date 
    my.own.Date myOwndate ; 

    // util.Date 
    Date utilDate; 
    } 
} 
0

मैं सिर्फ एक ही समस्या थी, मैं क्या किया, मैं पुस्तकालय क्रम अनुक्रम में व्यवस्था की, उदाहरण के लिए वहाँ java.lang.NullPointerException और javacard.lang.NullPointerException थे। मैंने पहली बार डिफ़ॉल्ट लाइब्रेरी के रूप में बनाया है और यदि आपको दूसरे का उपयोग करने की आवश्यकता है तो आप स्पष्ट रूप से पूर्ण योग्य क्लास नाम निर्दिष्ट कर सकते हैं।

1

आप वास्तव में चाहते हैं या दो अलग संकुल से एक ही वर्ग के नाम का उपयोग करने की जरूरत है, तो आप दो विकल्प हैं:

1-लेने आयात में इस्तेमाल करते हैं और दूसरे की पूरी तरह से योग्य वर्ग के नाम का उपयोग करने के एक:

import my.own.Date; 

class Test{ 

    public static void main(String[] args){ 

     // I want to choose my.own.Date here. How? 
     //Answer: 
     Date ownDate = new Date(); 

     // I want to choose util.Date here. How ? 
     //Answer: 
     java.util.Date utilDate = new java.util.Date(); 

    } 
} 


2-हमेशा पूरी तरह से योग्य वर्ग के नाम का उपयोग करें:

//no Date import 
class Test{ 

    public static void main(String[] args){ 

    // I want to choose my.own.Date here. How? 
    //Answer: 
    my.own.Date ownDate = new my.own.Date(); 
    // I want to choose util.Date here. How ? 
    //Answer: 
    java.util.Date utilDate = new java.util.Date(); 

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