কেন জাভাতে এনাম ফাইনালে তুলনা করা হয়?


95

জাভাতে একটি এনাম Comparableইন্টারফেস প্রয়োগ করে । এটিকে ওভাররাইড করতে চমৎকার হত Comparable'র compareToপদ্ধতি, কিন্তু এখানে এটি চূড়ান্ত হিসেবে চিহ্নিত হচ্ছে। ডিফল্ট প্রাকৃতিক অর্ডার Enumএর compareToতালিকাভুক্ত ক্রম।

কেউ কি জানেন যে জাভা এনামদের কেন এই বিধিনিষেধ আছে?


কার্যকর জাভাতে একটি খুব সূক্ষ্ম ব্যাখ্যা আছে - আইটেম 10-তে তৃতীয় সংস্করণ (সমানতার সাথে ডিল করা) (তবে আইটেম 14 এ তারা তুলনামূলক সমস্যাটিই বলেছে) (একই)। সংক্ষেপে: আপনি যদি একটি তাত্ক্ষণিক ক্লাস প্রসারিত করেন (এনামের মতো) এবং কোনও মান উপাদান যুক্ত করেন তবে আপনি সমান (বা তুলনামূলক) চুক্তিটি সংরক্ষণ করতে পারবেন না।
ক্রিশ্চিয়ান এইচ। কুহান

উত্তর:


121

ধারাবাহিকতার জন্য আমি অনুমান করি ... আপনি যখন কোনও enumপ্রকারটি দেখেন , আপনি একটি সত্যের জন্য জানেন যে এর প্রাকৃতিক ক্রম হ'ল ক্রম স্থির হিসাবে ঘোষণা করা হয়।

এটি কার্যকর করার জন্য, আপনি সহজেই নিজের তৈরি করতে পারেন Comparator<MyEnum>এবং যখনই আপনাকে অন্য কোনও অর্ডিংয়ের প্রয়োজন হয়:

enum MyEnum
{
    DOG("woof"),
    CAT("meow");

    String sound;    
    MyEnum(String s) { sound = s; }
}

class MyEnumComparator implements Comparator<MyEnum>
{
    public int compare(MyEnum o1, MyEnum o2)
    {
        return -o1.compareTo(o2); // this flips the order
        return o1.sound.length() - o2.sound.length(); // this compares length
    }
}

আপনি Comparatorসরাসরি ব্যবহার করতে পারেন :

MyEnumComparator c = new MyEnumComparator();
int order = c.compare(MyEnum.CAT, MyEnum.DOG);

বা সংগ্রহ বা অ্যারেতে এটি ব্যবহার করুন:

NavigableSet<MyEnum> set = new TreeSet<MyEnum>(c);
MyEnum[] array = MyEnum.values();
Arrays.sort(array, c);    

আরো তথ্য:


একটি সংগ্রহকে এনাম সরবরাহ করার সময় কাস্টম তুলকগুলি কেবল সত্যই কার্যকর। আপনি সরাসরি তুলনা করতে চাইলে এটি তেমন সাহায্য করে না।
মার্টিন ওকনোর

7
হ্যাঁ এটা করে. নতুন MyEnumComparator.compare (enum1, enum2)। এবং voilá।
বোম্বে

@ মার্টিনোকনোনার এবং বোম্ব: আমি আপনার মন্তব্যগুলিকে উত্তরে অন্তর্ভুক্ত করেছি। ধন্যবাদ!
জাচ স্ক্রিভেনা

যেহেতু MyEnumComparatorকোনও রাজ্য নেই, এটি কেবল একটি সিঙ্গলটন হওয়া উচিত, বিশেষত যদি আপনি @ বোম্বের পরামর্শ অনুসারে কাজ করছেন; পরিবর্তে, আপনি MyEnumComparator.INSTANCE.compare(enum1, enum2)অপ্রয়োজনীয় অবজেক্ট তৈরি এড়ানোর মতো কিছু করতে চান
kbolino

4
@ কেবোলিনো: তুলনাকারী এনাম ক্লাসের ভিতরে নেস্টেড ক্লাস হতে পারে। এটি LENGTH_COMPARATORএনামের স্ট্যাটিক ক্ষেত্রে সংরক্ষণ করা যেতে পারে । যেভাবে এনাম ব্যবহার করছেন তার পক্ষে এটি খুঁজে পাওয়া সহজ হবে।
লিই

40

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


  //===== SI BYTES (10^n) =====//

  /** 1,000 bytes. */ KILOBYTE (false, true,  3, "kB"),
  /** 106 bytes. */   MEGABYTE (false, true,  6, "MB"),
  /** 109 bytes. */   GIGABYTE (false, true,  9, "GB"),
  /** 1012 bytes. */  TERABYTE (false, true, 12, "TB"),
  /** 1015 bytes. */  PETABYTE (false, true, 15, "PB"),
  /** 1018 bytes. */  EXABYTE  (false, true, 18, "EB"),
  /** 1021 bytes. */  ZETTABYTE(false, true, 21, "ZB"),
  /** 1024 bytes. */  YOTTABYTE(false, true, 24, "YB"),

  //===== IEC BYTES (2^n) =====//

  /** 1,024 bytes. */ KIBIBYTE(false, false, 10, "KiB"),
  /** 220 bytes. */   MEBIBYTE(false, false, 20, "MiB"),
  /** 230 bytes. */   GIBIBYTE(false, false, 30, "GiB"),
  /** 240 bytes. */   TEBIBYTE(false, false, 40, "TiB"),
  /** 250 bytes. */   PEBIBYTE(false, false, 50, "PiB"),
  /** 260 bytes. */   EXBIBYTE(false, false, 60, "EiB"),
  /** 270 bytes. */   ZEBIBYTE(false, false, 70, "ZiB"),
  /** 280 bytes. */   YOBIBYTE(false, false, 80, "YiB");

উপরোক্ত ক্রমটি সোর্স কোডে ভাল দেখাচ্ছে, তবে লেখক কীভাবে তুলনামূলকভাবে কাজ করবে তা বিশ্বাস করে না। পছন্দসই তুলনা করার আচরণটি বাইটের সংখ্যা অনুসারে অর্ডার করা। উত্স-কোড ক্রম যা এমনটি ঘটবে তা কোডের সংস্থাকে হ্রাস করে।

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


4
সম্মত হন, আমি চাই যে আমার এনামগুলি কোনও আদেশের পরিবর্তে ব্যবসায়ের তুলনামূলক অ্যালগরিদম করতে সক্ষম হবেন যা যদি কেউ মনোযোগ না দেয় তবে এটি ভেঙে যেতে পারে।
দ্য বাক্কার

6

ক্রম মানগুলি ঘোষিত আদেশ অনুসারে যথাযথভাবে যুক্তিযুক্তভাবে অর্ডার করা হয়। এটি জাভা ভাষার নির্দিষ্টকরণের অংশ of সুতরাং এটি অনুসরণ করে যে গণনা মানগুলি কেবল একই এনুমের সদস্য হলে তুলনা করা যায়। স্পেসিফিকেশনটি আরও গ্যারান্টি দিতে চায় যে তুলনাযোগ্য আদেশটি তুলনাযোগ্য () দ্বারা ফেরত দেওয়া একই ক্রম হিসাবে মানগুলি ঘোষিত হয়েছিল। এটি একটি গণনার খুব সংজ্ঞা।


থমাস পেইন যেমন তার উদাহরণে স্পষ্ট করেছিলেন, ভাষা কেবল সিনট্যাকটিক্স দ্বারা অর্ডার করতে পারে, শব্দার্থতত্ত্ব দ্বারা নয়। আপনি বলছেন, আইটেমগুলি লজিক্যাল অর্ডার করা হয়েছে , তবে আমি যেভাবে এনামকে বুঝি, আইটেমগুলি লজিক্যাল উপায়ে encapsulated হয়।
বন্ডাক্স

2

একটি সম্ভাব্য ব্যাখ্যা এটি compareToসামঞ্জস্যপূর্ণ হওয়া উচিত equals

এবং equalsএনামগুলির জন্য পরিচয়ের সমতা ( ==) এর সাথে সামঞ্জস্য করা উচিত ।

যদি compareToঅ-চূড়ান্ত হয় তবে এটি এমন আচরণের সাথে ওভাররাইড করা সম্ভব হবে যা সামঞ্জস্যপূর্ণ নয় equals, যা খুব পাল্টা-স্বজ্ঞাত হবে।


যদিও এটি সুপারিশ করা হয় যে তুলনাটি () সমান () এর সাথে সামঞ্জস্যপূর্ণ, এটি প্রয়োজনীয় নয়।
খ্রিস্টান এইচ। কুহান

-1

আপনি যদি এনামের উপাদানগুলির প্রাকৃতিক ক্রম পরিবর্তন করতে চান তবে উত্স কোডে তাদের ক্রমটি পরিবর্তন করুন।


হ্যাঁ, আমি আসল এন্ট্রিতে যা লিখেছিলাম :)
neu242

হ্যাঁ তবে আপনি কেন তুলনামূলক তুলনায় () তুলনায় ওভাররাইড করতে চান তা সত্যই আপনি ব্যাখ্যা করতে পারেন না। সুতরাং আমার উপসংহারটি ছিল যে আপনি কিছু খারাপ করার চেষ্টা করছেন I এবং আমি আপনাকে আরও সঠিক উপায়ে দেখানোর চেষ্টা করছি।
বোম্বে

কম্পিউটারগুলি যখন আমার চেয়ে অনেক বেশি ভাল করে তখন আমাকে কেন হাতের দ্বারা প্রবেশগুলি বাছাই করতে হবে তা আমি দেখতে পাই না।
neu242

গণনায় এটি ধরে নেওয়া হয় যে আপনি কোনও কারণে নির্দিষ্ট কারণে প্রবেশের আদেশ দিয়েছেন। যদি কোনও কারণ না থাকে তবে আপনি <enum> .toString ()। তুলনা করুন () ব্যবহার করে ভাল। অথবা হয়ত পুরোপুরি কিছু আলাদা, সম্ভবত একটি সেট?
বোম্বে

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