एक ही नाम से दो वर्गों का आयात। कैसे नियंत्रण करे?


107

कहो मैं एक कोड की तरह हूँ:

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 ?

  }
}

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


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

जवाबों:


154

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

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

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


2
यदि आप ग्रहण का उपयोग कर रहे हैं, तो आप your.own.Datectrl + shift + R का उपयोग करके नाम बदल सकते हैं । यह आपके कोड में, साथ ही फ़ाइल (और फ़ाइल नाम) में आपके / खुद / Date.java में आपके द्वारा संदर्भित हर जगह इसे स्वचालित रूप से बदल देगा। किसी अन्य आईडीई में संभवतः एक समान सुविधा है।
MatrixFrog

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

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

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

5
मेरे सबसे लगातार नाम टकराव के साथ होता है org.apache.log4j.Loggerऔर java.util.logging.Logger। आमतौर पर, मेरा एक तरफ या दूसरे पर कोई नियंत्रण नहीं है; मैं विरासत कोड एकीकरण कर रहा हूं।
केविनरपे

21

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

जैसे

//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
बेस्ट प्रैक्टिस में सबसे ज्यादा इस्तेमाल किया जाने वाला इम्पोर्ट है, पूरी क्लासपाथ के साथ कम से कम इस्तेमाल किए जाने वाले का उपयोग करते हुए
अल्पलासन

10

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

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

7

इसे करने का एक और तरीका यह है:

package my.own;

public class FQNDate extends Date {

}

और फिर java.util.Date पैकेज में my.own.FQNDate आयात करें।


मैं इसे पसंद करता हूं (यह सरल है) हालांकि यह स्थैतिक तरीकों तक पहुंचने के लिए मुद्दे को संबोधित नहीं करता है।
जस्टिन ओम्स

मैं यह हर समय करता हूं जब मैं एक ही कक्षा में हैमरेस्ट Matchersऔर मॉकिटो का उपयोग करना चाहता हूं Matchers। यह स्थिर तरीकों से काम करने लगता है।
एडम बुर्ले

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

यह एक बुरा अभ्यास है। जब तक कुछ कार्यक्षमता मूल वर्ग से विस्तारित नहीं की जा रही है तब तक कक्षाओं को विस्तारित नहीं किया जाना चाहिए।
पार्थ

3

यदि आपके पास अपना स्वयं का दिनांक वर्ग है, तो आपको इसे अलग-अलग बनाना चाहिए जैसे कि Date Class में बनाया गया है। यानी आपने अपना निर्माण क्यों किया। ImmutableDate या BetterDate या NanoDate जैसी कोई चीज़, यहां तक ​​कि MyDate से यह संकेत मिलता है कि आपके पास अपना स्वयं का दिनांक वर्ग क्यों है। इस मामले में, उनके पास एक अनूठा नाम होगा।


3

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

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

import java.util.Date;

class Test{

  public static void main(String [] args){

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

    // util.Date
    Date utilDate;
  }
}

2

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

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

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

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

:)


2

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

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


2

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

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();

  }
}

0

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


0

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

आप इस तरह से कर सकते हैं:

import first.Foo;

public class Main {
    public static void main(String[] args) {
        System.out.println(new Foo());
        System.out.println(new second.Foo());
    }
}



package first;

public class Foo {
    public Foo() {
    }

    @Override
    public String toString() {
        return "Foo{first class}";
    }
}



package second;

public class Foo {
    public Foo() {
    }

    @Override
    public String toString() {
        return "Foo{second class}";
    }
}

आउटपुट:

Foo{first class}
Foo{second class}

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