ইন্টারফেসে .compareTo () কেন জাভাতে ক্লাসে থাকে?


30

আমি জানতে চাই কেন চাই .compareTo()রয়েছে Comparableইন্টারফেস যখন মত একটি পদ্ধতি .equalsরয়েছে Objectবর্গ। আমার কাছে এটা নির্বিচারে বলে মনে হয় কেন মত একটি পদ্ধতি .compareTo()নয় Objectইতিমধ্যে বর্গ।

ব্যবহার করার জন্য .compareTo(), আপনি Comparableইন্টারফেসটি প্রয়োগ করেন .compareTo()এবং আপনার প্রয়োজনের জন্য পদ্ধতিটি প্রয়োগ করেন । জন্য .equals()পদ্ধতি, আপনি কেবল পদ্ধতি আপনার ক্লাসে উপেক্ষা না যেহেতু সব শ্রেণীর উত্তরাধিকারী Objectবর্গ।

আমার প্রশ্ন হ'ল একটি পদ্ধতি কেন এমন একটি .compareTo()ইন্টারফেসের মতো যা আপনি প্রয়োগ না করে বরং শ্রেণীর চেয়ে পছন্দ করেন Object? একইভাবে, .equals()ক্লাসে পদ্ধতিটি কেন Objectএবং কোনও ইন্টারফেসে প্রয়োগ করা হবে না কেন ?



2
এটি জাভা ভাষার একটি নকশা পছন্দ (অগত্যা এটি সঠিক পছন্দ ছিল এর অর্থ নয়)। অন্যান্য ভাষায়, যেমন হাস্কেল , আপনাকে মান সমতা পাওয়ার জন্য সমতা ইন্টারফেসটি প্রয়োগ করতে হবে (আসলে আপনি Eqটাইপক্লাসে একটি উদাহরণ সরবরাহ করেন )।
মুচাহো

2
সম্পর্কিত মেটা প্রশ্ন: এই প্রশ্নগুলি একে অপরের নকল?

উত্তর:


58

সমস্ত বস্তুর তুলনা করা যায় না, তবে সমস্ত বস্তুর সমতার জন্য পরীক্ষা করা যায়। যদি অন্য কিছু না হয় তবে মেমরির (রেফারেন্স সমতা) একই স্থানে দুটি বস্তুর উপস্থিতি রয়েছে কিনা তা দেখতে পাবে।

compareTo()এটি দুটি Threadঅবজেক্টের অর্থ কী ? কীভাবে একটি থ্রেড অন্যের চেয়ে "বড়" হয়? আপনি কিভাবে দুটি ArrayList<T>এস তুলনা করবেন ?

Objectচুক্তি প্রযোজ্য সব জাভা ক্লাস। এমনকি যদি একটি শ্রেণিকেও তার নিজস্ব বর্গের অন্যান্য দৃষ্টান্তের সাথে তুলনা করা Objectযায় না , তবে ইন্টারফেসের অংশ হওয়ার জন্য এটির প্রয়োজন হতে পারে না।

কেন কোনও শ্রেণি প্রয়োগ করতে চাইছে তা ব্যাখ্যা করার সময় জোশুয়া ব্লচ "প্রাকৃতিক অর্ডারিং" মূল শব্দটি ব্যবহার করেছেন Comparable। না যে বর্গ তাই প্রতি বর্গ বাস্তবায়ন করা উচিত হিসাবে আমি উপরে আমার উদাহরণ উল্লেখ একটি প্রাকৃতিক ক্রম আছে, Comparableকিংবা উচিত Objectআছে compareToপদ্ধতি।

... compareToপদ্ধতিটি ঘোষিত হয়নি Object। ... এটি বর্তমানে এমন চরিত্রে অনুরূপ Object'র equalsপদ্ধতি ছাড়া এটা সহজ সমতা তুলনা ছাড়াও অর্ডার তুলনা অনুমতি দেয়, এবং এটি জেনেরিক হয়। প্রয়োগ করে Comparable, একটি শ্রেণি নির্দেশ করে যে এর দৃষ্টান্তগুলির একটি প্রাকৃতিক ক্রম রয়েছে

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

ক্ষেত্রে যেখানে তোমার জন্য না একটি অ উপর একটি ক্রম আরোপ করতে চান Comparableযে একটি প্রাকৃতিক ক্রম নেই বর্গ, আপনি সবসময় এমন একটি সরবরাহ করতে পারে Comparatorসাহায্যের জন্য উদাহরণস্বরূপ সাজানোর এটা।


3
আপনি যখন ব্যতিক্রমের সাথে তুলনা করার কথা ভাবতে শুরু করেন তখন আরও মজা হয় (যা কোনও বিমূর্ত শ্রেণি নয় এবং এভাবে এটি "নলপয়েন্টারএক্সপেশন ডটকম্পেরটো" এর অর্থ বাস্তবায়ন করত ... #UngupportFlavorException) ... অর্থ?

10
সমস্ত বস্তু জাভাতে সমতার জন্য পরীক্ষা করা যেতে পারে হ্যাঁ, তবে সাধারণভাবে নয়। কিছু বস্তুর উদাহরণ রয়েছে যেখানে সমতার তুলনাটি অর্থবোধ করে না (এমনকি রেফারেন্স সমতাও নয়) - যেমন সিঙ্গেলটন let মান মূল্য এবং রেফারেন্সএকুয়ালিটির মতো ইন্টারফেস (বিমূর্ত শ্রেণি) থাকতে পারে। এটি এতটা খারাপ ধারণাও নাও হতে পারে ...
qbd

5
"সমস্ত বস্তু সমতার জন্য যাচাই করা যেতে পারে else অন্য কিছু না হলে, মেমোরিতে একই অবস্থানে দুটি বস্তুর উপস্থিতি আছে কিনা তা দেখতে পাওয়া যায় (রেফারেন্স সমতা)" " - যেহেতু আমাদের ==উত্তরোত্তর রয়েছে, এর এটিতে ফাঁকা আংটি রয়েছে। অপ্রয়োজনীয় ডিফল্টটিকে অগ্রাহ্য করে, কোনও ব্যক্তি equalsসমস্ত শ্রেণীর উপর ধারনা না করার বৈধ কারণগুলি খুঁজে পেতে পারে , যেহেতু সমস্ত ধরণের সমতা সম্পর্ককে সমর্থন করতে পারে না।
রাফেল

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

6
@ স্নোম্যান বাস্তবায়ন বাস্তবায়ন সম্পর্কিত বিশদ প্রকাশের সাথে এটি বেহুদা সম্মিলিত হ'ল এটির অনুমতি না দেওয়ার পক্ষে যথেষ্ট কারণ। জাভা 8-তে প্রতিটি "মান-ভিত্তিক" শ্রেণীর কিছুটা বয়লারপ্লেট রয়েছে যা ==" আপনি যদি ব্যবহার করেন তবে তার জন্য আমরা দায়বদ্ধ নই " কারণ এই শ্রেণিগুলি কীভাবে ইনস্ট্যান্টিয়েটেড করা হয় তা বাস্তবায়নের বিবরণ তবে ভাষাটি এটি আড়াল করা অসম্ভব করে তোলে। আপনি বলতে পারেন যে, যে কেউ দু'জনের সাথে Integerরেফারেন্সের সাথে তুলনা করছেন তিনি বোকা, তবে এর সাথে তুলনা শুরু করার অনুমতি দেওয়া এখনও গভীর।
ডোভাল

8

JLS §4.3.2 সংজ্ঞায়িত classনিম্নলিখিত পদ্ধতিতে বস্তু:

4.3.2। ক্লাস অবজেক্ট

ক্লাসটি Objectঅন্য সমস্ত শ্রেণীর একটি সুপারক্লাস (§8.1.4)।

সমস্ত শ্রেণি এবং অ্যারে ধরণের শ্রেণীর পদ্ধতিগুলি (§8.4.8) উত্তরাধিকার সূত্রে প্রাপ্ত Objectহয়:

  • পদ্ধতিটি cloneকোনও বস্তুর নকল তৈরি করতে ব্যবহৃত হয়।

  • পদ্ধতিটি equalsঅবজেক্টের সমতার ধারণাটি সংজ্ঞায়িত করে, যা মানের উপর ভিত্তি করে রেফারেন্স, তুলনা করে না।

  • finalizeকোনও বস্তু ধ্বংস হওয়ার ঠিক আগে পদ্ধতিটি চালানো হয় (.612.6)।

  • পদ্ধতিটি getClassক্লাস অবজেক্টকে প্রত্যাবর্তন করে যা বস্তুর শ্রেণীর প্রতিনিধিত্ব করে।

  • Classপ্রতিটি রেফারেন্স ধরণের জন্য একটি অবজেক্ট বিদ্যমান। উদাহরণস্বরূপ, এটি কোনও শ্রেণীর সম্পূর্ণরূপে যোগ্যতাসম্পন্ন নাম, এর সদস্যদের, তার তাত্ক্ষণিক সুপারক্লাস এবং এটি প্রয়োগ করে এমন কোনও ইন্টারফেস আবিষ্কার করতে ব্যবহার করা যেতে পারে।

    একটি পদ্ধতি আবাহন অভিব্যক্তি ধরণ getClassহয় Class<? extends |T|>যেখানে Tক্লাস হয় বা ইন্টারফেস (§15.12.1) অনুসন্ধান করছিলেন তার getClass

    ঘোষিত একটি শ্রেণির পদ্ধতি synchronized(§8.4.3.6) শ্রেণীর শ্রেণীর অবজেক্টের সাথে সম্পর্কিত মনিটরে সিঙ্ক্রোনাইজ করে।

  • পদ্ধতিটি hashCodeহ্যাশটবেলে যেমন সমান পদ্ধতিটির সাথে একত্রে খুব দরকারী java.util.Hashmap

  • পদ্ধতি wait, notifyএবং notifyAllসহগামী প্রোগ্রামিং ব্যবহার থ্রেড (§17.2) ব্যবহার করা হয়।

  • পদ্ধতিটি toStringবস্তুর একটি স্ট্রিং প্রতিনিধিত্ব প্রদান করে।

সুতরাং, যে কেন equalsহয় Objectকিন্তু compareToএকটি পৃথক ইন্টারফেস রয়েছে। আমি অনুমান করব যে তারা Objectযতটা সম্ভব ন্যূনতম রাখতে চাইছিল । তারা সম্ভবত বুঝতে পেরেছিল যে প্রায় সকলেরই Objects প্রয়োজন হবে equalsএবং hashCode(যা সত্যই সাম্যতা পরীক্ষার একধরণের রূপ) তবে সমস্ত বস্তুর অর্ডার দেওয়ার ধারণা থাকতে হবে না , এটিই যার compareToজন্য ব্যবহৃত হয়।


আমি অনুমান করি যে তাত্ত্বিকভাবে একটি ইন্টারফেস হতে পারে Equitable<T>তবে যদি Objectএটি প্রয়োগ করা হয় তবে প্রতিটি শ্রেণি একটি হবে Equitable<Object>। এই সময়ে, কোন পার্থক্য আছে? বাস্তবে বাস্তবে নয়, জটিলতায় হ্যাঁ।
ক্যাপ্টেন ম্যান

1
@ ক্যাপ্টিম্যান ইন। নেট, objectরয়েছে Equals(object)ঠিক জাভা এর মতো, তবে IEquatable<T>ইন্টারফেসও রয়েছে। যদিও এটির বিদ্যমান থাকার প্রাথমিক কারণটি হ'ল বক্সিংয়ের Tমূল্য এড়ানো যখন এটি জাভাতে সম্ভব নয়।
এসভিক

হ্যাশকোড সাম্য পরীক্ষার একটি রূপ নয় , কারণ হ্যাশের সংঘর্ষ রয়েছে। যদি এ এবং বি সমান হয় তবে তাদের একই হ্যাশকোড রয়েছে, তবে যদি এ এবং বি এর হ্যাশকোড একই থাকে তবে এর অর্থ এই নয় যে তারা সমান!
জোসেফ

প্রকৃতপক্ষে, আপনার উত্তরটি কোনও পুরানো জেএলএস ( টাইটানিয়াম.সি.এস.বার্কলে.ইডু / ডক / জাভা- অংগস্পেক ১.০.পিডিএফ ) এ স্যুইচ করে ব্যাপক উপকৃত হবে - এটি সরাসরি equalsঘোষণা করা হয়েছে কেন তার আরও অনেক ভাল উদ্ধৃতি রয়েছে Object: The methods equals and hashCode are declared for the benefit of hashtables such as java.util.Hashtable (§21.7)- জাভা ডিজাইন হিসাবে পিছনের দিকে সামঞ্জস্যপূর্ণ, জাভা 1.0 ডিজাইন পছন্দটি এটি হওয়ার আসল কারণ equals
ভ্যাক্সকুইস

যেহেতু আমি প্রস্তাবিত সম্পাদনাটি সম্ভবত "খুব কঠোর" বলে প্রত্যাখ্যানিত হবে, আপনি যদি নিজের উত্তরের সাথে কেবলমাত্র Ctrl + C / Ctrl + V প্রাসঙ্গিক
জিনিসটি দেখতে চান

2

স্নোম্যানের দুর্দান্ত উত্তরের পাশাপাশি মনে রাখবেন যে Comparableদীর্ঘ দিন ধরে একটি জেনেরিক ইন্টারফেস ছিল। একটি প্রকার বাস্তবায়ন করে না compareTo(object), এটি প্রয়োগ করে compareTo(T)যেখানে Tতার নিজস্ব প্রকার রয়েছে। এটি কার্যকর করা যায় না object, যেহেতু objectএটি থেকে উত্পন্ন ক্লাসটি জানেন না।

objectকোনও compareTo(object)পদ্ধতি সংজ্ঞায়িত করতে পারত তবে এটি স্নোম্যানকে কেবল যেটি নির্দেশ করেছিল তা কেবল অনুমোদন করতে পারত না, দুটি ArrayList<T>এস বা দুটি Threadএর মধ্যে একটি তুলনা করতে পারে, তবে এমনকি একটি ArrayList<T>এবং ক এর মধ্যে একটি তুলনাও করতে পারত Thread। এটি আরও অযৌক্তিক


0

ধরুন আমার কাছে দুটি অবজেক্টের রেফারেন্স রয়েছে: এক্স String"জর্জ" সামগ্রীটি ধারণ করার একটি উদাহরণ সনাক্ত করে; Y Pointস্থানাঙ্কগুলি রাখার উদাহরণটি সনাক্ত করে [12,34]। নিম্নলিখিত দুটি প্রশ্ন বিবেচনা করুন:

  • এক্স এবং ওয়াই সমতুল্য বস্তুগুলি সনাক্ত করে?

  • X এর আগে, পরে, বা Y এর সমতুল্য হওয়া উচিত?

এক্স এবং ওয়াই প্রথম প্রশ্ন বিবেচনা করার পরে কোনও সম্পর্কযুক্ত প্রকারের দৃষ্টান্ত সনাক্ত করতে পারে না। বস্তুগুলি কেবলমাত্র সমতুল্য হিসাবে বিবেচিত হতে পারে যদি তাদের প্রকারগুলি একটি সাধারণ বেস ভাগ করে দেয় যা তাদের সমতুল্য হিসাবে সংজ্ঞায়িত করে; যেহেতু Stringএবং এর Pointমতো কোনও বেস নেই (তাদের একমাত্র সাধারণ বেস ধরণের সমস্ত স্বতন্ত্র বস্তুকে অ সমতুল্য হিসাবে বিবেচনা করে) উত্তরটি কেবল "না"।

প্রকারগুলি সম্পর্কিত নয়, তবে দ্বিতীয় প্রশ্নটি নিয়ে এটি একটি বিশাল সমস্যা। কিছু প্রকারের তাদের দৃষ্টান্ত মধ্যে ক্রম সম্পর্ক সংজ্ঞায়িত, এবং কিছু ক্রম সম্পর্ক এমনকি একাধিক প্রকারের উপর প্রসারিত করতে পারেন [যেমন তার জন্য সম্ভব হবে BigIntegerএবং BigDecimalতুলনা পদ্ধতি সম্ভব হবে এই দুই ধরনের যেকোন স্থানেই অন্যান্য দৃষ্টান্ত আপেক্ষিক তম স্থান করা সংজ্ঞায়িত করতে], কিন্তু সাধারণভাবে দুটি স্বেচ্ছাচারিত দৃষ্টান্ত গ্রহণ করা সম্ভব নয় এবং "হোয়াইট এক্স এর আগে, পরে বা তার সমতুল্য" জিজ্ঞাসা করা এবং মোট ক্রমটি অর্ডার করা সম্ভব হয় না। সামগ্রিকভাবে না হলেও তথ্যের জন্য ধারাবাহিক ক্রমটির প্রতিবেদন করার প্রয়োজন হলে "কিসের আগে X, এর আগে সমতুল্য, বা ওয়াইয়ের সাথে সম্মানহীনভাবে সংযুক্ত করা উচিত" জিজ্ঞাসা করা সম্ভব হবেএক, তবে সর্বাধিক বাছাই করা অ্যালগরিদমের জন্য মোট ক্রম দরকার। সুতরাং, compareTo"অরক্ষিত" বৈধ প্রত্যাবর্তন যদি সমস্ত অবজেক্ট কোনও পদ্ধতি বাস্তবায়ন করতে পারে, তবুও এ জাতীয় পদ্ধতি তার অস্তিত্ব প্রমাণ করার পক্ষে যথেষ্ট কার্যকর হবে না।

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