একই নামে দুটি ক্লাস আমদানি করা হচ্ছে। কীভাবে সামলাতে হবে?


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 ?

  }
}

আমার কি পূর্ণ যোগ্যতাসম্পন্ন শ্রেণীর নাম হওয়া উচিত? আমি কি আমদানির বিবৃতিগুলি থেকে মুক্তি পেতে পারি? রিয়েল ওয়ার্ল্ড প্রোগ্রামিংয়ে এমন দৃশ্য কি সাধারণ?


আপনার প্রশ্নের উত্তর আসলেই নয় তবে সি # তে আপনি কোনও নাম স্থানের জন্য একটি উপনাম ব্যবহার করতে পারেন। হতে এটা ঠিক অন্বিত চিনি কিন্তু এটা সত্যিই helpfull হল: 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
আপনি যদি Eclipse ব্যবহার করছেন, আপনি your.own.Datectrl + shift + R ব্যবহারের নামটি পরিবর্তন করতে পারেন । এটি আপনি নিজের কোডটিতে যেমন উল্লেখ করেন সেদিকে আপনার নিজের নিজের / তারিখের জাভা ফাইল (এবং ফাইলের নাম) এ এটি স্বয়ংক্রিয়ভাবে বদলে যাবে। অন্য যে কোনও আইডিইতে সম্ভবত একই বৈশিষ্ট্য রয়েছে।
ম্যাট্রিক্সফ্রোগ

16
আমি সর্বশেষ বক্তব্যের সাথে একমত নই আপনি যদি নিজের ডেট ক্লাসটি ডিজাইন করতে চান তবে এটি Dateহ'ল সঠিক নাম। আপনি এটি আপনার বেশিরভাগ কোডে ব্যবহার করবেন। যাইহোক, কখনও কখনও java.util.Dateউভয়ের মধ্যে কথোপকথন করার জন্য আপনাকে উল্লেখযোগ্যভাবে কল করতে হবে ।
প্যারাডিজমেটিক

2
@ ম্যাট্রিক্সফ্রাগ আপনার নির্দিষ্ট করে দেওয়া Eclipse এর বৈশিষ্ট্যটি নেটবিয়ান আইডিই দ্বারা সরবরাহ করা হয়েছে। এই বৈশিষ্ট্যটি "রিফ্যাক্টর" হিসাবে পরিচিত। আপনার তথ্যটি ভুল ছিল না তবে এটি জিজ্ঞাসিত প্রশ্নের উত্তর নয়। তিনি (রজার) যদি সেই কোডটি বিকাশ করে থাকেন তবে অবশ্যই তিনি জানেন যে তিনি তার ক্লাসের নাম পরিবর্তন বা রিফ্যাক্টর করতে পারেন। তিনি যা জিজ্ঞাসা করছেন তা আপনার দেওয়া জবাব থেকে আলাদা।
ইয়াতেন্দ্র গোয়েল

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.
সিপিটিবার্টেন্ডার

এটি একটি খারাপ অভ্যাস। মূল শ্রেণি থেকে কিছু কার্যকারিতা বাড়ানো না থাকলে ক্লাসগুলি বাড়ানো উচিত নয়।
পার্থ

3

যদি আপনার নিজস্ব তারিখ শ্রেণি থাকে তবে আপনার এটি পৃথক করা উচিত তারিখ শ্রেণিতে নির্মিত। অর্থাৎ আপনি কেন নিজের তৈরি করলেন? ইমমিটেবলডেট বা বেটারডেট বা ন্যানোডেটের মতো কিছু, এমনকি মাইডেট আপনার নিজের তারিখের শ্রেণি কেন তাও নির্দেশ করবে। এই ক্ষেত্রে, তাদের একটি অনন্য নাম থাকবে।


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

আমার ঠিক একই সমস্যা ছিল, আমি যা করেছি, আমি লাইব্রেরির ক্রমটি ধারাবাহিকভাবে সাজিয়েছি, উদাহরণস্বরূপ জাভা.লং.নুলপয়েন্টার এক্সসেপশন এবং জাভাকার্ড.লং.নুলপয়েন্টার এক্সসেপশন ছিল। আমি প্রথমটিকে ডিফল্ট লাইব্রেরি হিসাবে তৈরি করেছি এবং অন্যটি ব্যবহারের প্রয়োজন হলে আপনি স্পষ্টভাবে পূর্ণ যোগ্যতাসম্পন্ন শ্রেণীর নাম উল্লেখ করতে পারেন।


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}

আপনার উত্তরে স্ক্রিনশট থেকে কোডটি অন্তর্ভুক্ত করুন।
থমাস ল্যান্ডউয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.