আপনি যখন নিজের কী জোড় বস্তুটি তৈরি করেন তখন আপনার কয়েকটি জিনিসটির মুখোমুখি হওয়া উচিত।
প্রথমত, আপনার বাস্তবায়ন সম্পর্কে সচেতন হওয়া উচিত hashCode()
এবং equals()
। আপনার এটি করা দরকার।
দ্বিতীয়ত, প্রয়োগ করার সময় hashCode()
, নিশ্চিত হয়ে নিন যে এটি কীভাবে কাজ করে। প্রদত্ত ব্যবহারকারীর উদাহরণ
public int hashCode() {
return this.x ^ this.y;
}
আসলে আপনি করতে পারেন এমন একটি খারাপ বাস্তবায়ন। কারণটি সহজ: আপনার অনেকগুলি সমান হ্যাশ রয়েছে! এবং hashCode()
অন্তর্নিহিত মানগুলি ফিরিয়ে নেওয়া উচিত যা বিরল, সর্বোত্তমরূপে অনন্য হতে থাকে। এর মতো কিছু ব্যবহার করুন:
public int hashCode() {
return (X << 16) + Y;
}
এটি দ্রুত এবং -2 ^ 16 এবং 2 ^ 16-1 (-65536 থেকে 65535) এর মধ্যে কীগুলির জন্য স্বতন্ত্র হ্যাশগুলি দেয়। এটি প্রায় কোনও ক্ষেত্রেই খাপ খায়। খুব কমই আপনি এই সীমা ছাড়িয়ে যান।
তৃতীয়, বাস্তবায়ন করার সময় equals()
সময় এটি কী জন্য ব্যবহৃত হয় তাও জানুন এবং কীভাবে আপনি আপনার কীগুলি তৈরি করেন সে সম্পর্কে সচেতন হন, যেহেতু সেগুলি বস্তুযুক্ত। বিবৃতিগুলির কারণে আপনার সর্বদা একই ফল হয় যদি আপনি প্রায়শই অপ্রয়োজনীয় করেন।
আপনি যদি এই জাতীয় কী তৈরি করেন: map.put(new Key(x,y),V);
আপনি কখনই আপনার কীগুলির উল্লেখগুলি তুলনা করতে পারবেন না। আপনি যতবার মানচিত্রে অ্যাক্সেস করতে চান তার কারণ আপনি এর মতো কিছু করবেন map.get(new Key(x,y));
। সুতরাং আপনার equals()
মত বিবৃতি প্রয়োজন হয় না if (this == obj)
। এটা হবে কখনই না ।
পরিবর্তে if (getClass() != obj.getClass())
আপনার মধ্যেequals()
আরও ভাল ব্যবহার if (!(obj instanceof this))
। এটি এমনকি সাবক্লাসের জন্য বৈধ হবে।
সুতরাং আপনাকে কেবলমাত্র তুলনা করার দরকারটি হ'ল আসলে এক্স এবং ওয়াই So তাই equals()
এই ক্ষেত্রে সবচেয়ে ভাল বাস্তবায়ন হ'ল :
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
সুতরাং শেষ পর্যন্ত আপনার মূল ক্লাসটি এরকম:
public class Key {
public final int X;
public final int Y;
public Key(final int X, final int Y) {
this.X = X;
this.Y = Y;
}
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
public int hashCode() {
return (X << 16) + Y;
}
}
এগুলি চূড়ান্ত হওয়ার কারণে এবং সংবেদনশীল তথ্য না রাখার কারণে আপনি আপনার মাত্রা সূচকগুলি X
এবং Y
একটি সর্বজনীন অ্যাক্সেস স্তর দিতে পারেন । আমি নই নিশ্চিত 100% private
অ্যাক্সেস স্তর সঠিকভাবে কাজ করে কোনো ক্ষেত্রে যখন ভোটদান Object
একটি থেকেKey
।
আপনি যদি ফাইনাল সম্পর্কে অবাক হন তবে আমি কোনও কিছুই চূড়ান্ত হিসাবে ঘোষণা করি যা কোন মানটি ইনস্ট্যান্সিংয়ের উপর সেট করা হয় এবং কখনই পরিবর্তিত হয় না - এবং তাই কোনও বস্তু ধ্রুবক।