কমন্স / ল্যাং বিল্ডাররা দুর্দান্ত এবং আমি বছরের পর বছর ধরে এগুলি ব্যবহারযোগ্য পারফরম্যান্স ওভারহেড ছাড়াই (হাইবারনেট সহ এবং না) ব্যবহার করে আসছি। তবে আলাইন যেমন লিখেছেন, পেয়ারা পথটি আরও সুন্দর:
এখানে বিনের একটি নমুনা দেওয়া হয়েছে:
public class Bean{
private String name;
private int length;
private List<Bean> children;
}
কমন্স / ল্যাং এর সাথে এখানে সমান () এবং হ্যাশকোড () প্রয়োগ করা হয়েছে:
@Override
public int hashCode(){
return new HashCodeBuilder()
.append(name)
.append(length)
.append(children)
.toHashCode();
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Bean){
final Bean other = (Bean) obj;
return new EqualsBuilder()
.append(name, other.name)
.append(length, other.length)
.append(children, other.children)
.isEquals();
} else{
return false;
}
}
এবং এখানে জাভা 7 বা উচ্চতর (পেয়ারা দ্বারা অনুপ্রাণিত) সহ:
@Override
public int hashCode(){
return Objects.hash(name, length, children);
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Bean){
final Bean other = (Bean) obj;
return Objects.equals(name, other.name)
&& length == other.length // special handling for primitives
&& Objects.equals(children, other.children);
} else{
return false;
}
}
দ্রষ্টব্য: এই কোডটি মূলত পেয়ারা রেফারেন্স করেছে, কিন্তু মতামত হিসাবে উল্লেখ করা হয়েছে যে, এই কার্যকারিতাটি তখন থেকে জেডিকে-তে প্রবর্তিত হয়েছে, সুতরাং পেয়ারা আর প্রয়োজন হয় না।
আপনি দেখতে পাচ্ছেন পেয়ারা / জেডি কে সংস্করণটি ছোট এবং অতিরিক্ত অতিরিক্ত সহায়ক সামগ্রীগুলি এড়িয়ে চলে। সমতার ক্ষেত্রে এটি এমনকি মূল্যায়ন শর্ট সার্কিট করার অনুমতি দেয় যদি পূর্ববর্তী Object.equals()
কলটি মিথ্যা বলে প্রত্যাবর্তন করে (ন্যায্য হতে পারে: কমন্স / ল্যাং এর ObjectUtils.equals(obj1, obj2)
সাথে অভিন্ন শব্দার্থবিজ্ঞানের একটি পদ্ধতি রয়েছে যা EqualsBuilder
উপরের মতো শর্ট সার্কিটের অনুমতি দেওয়ার পরিবর্তে ব্যবহার করা যেতে পারে )।
সুতরাং: হ্যাঁ, কমন্স ল্যাং বিল্ডাররা ম্যানুয়ালি নির্মিত equals()
এবং hashCode()
পদ্ধতিগুলির তুলনায় খুব পছন্দনীয় (বা সেই ভয়ঙ্কর দানবগ্রহণ আপনার জন্য গ্রহন করবে) তবে জাভা 7+ / গুয়ারা সংস্করণগুলি আরও ভাল।
এবং হাইবারনেট সম্পর্কে একটি নোট:
আপনার সমান (), হ্যাশকোড () এবং টসস্ট্রিং () বাস্তবায়নে অলস সংগ্রহগুলি ব্যবহার সম্পর্কে সতর্ক থাকুন। আপনার যদি একটি উন্মুক্ত অধিবেশন না থাকে তবে তা খারাপভাবে ব্যর্থ হবে।
দ্রষ্টব্য (সমান (সম্পর্কে)):
ক) উপরের সমান উভয় সংস্করণে (), আপনি এই শর্টকাটগুলির একটি বা উভয় ব্যবহার করতে চাইতে পারেন:
@Override
public boolean equals(final Object obj){
if(obj == this) return true; // test for reference equality
if(obj == null) return false; // test for null
// continue as above
খ) সমান () চুক্তির আপনার ব্যাখ্যার উপর নির্ভর করে আপনি লাইনও পরিবর্তন করতে পারেন
if(obj instanceof Bean){
প্রতি
// make sure you run a null check before this
if(obj.getClass() == getClass()){
আপনি যদি দ্বিতীয় সংস্করণ ব্যবহার করেন তবে আপনি সম্ভবত super(equals())
আপনার equals()
পদ্ধতির অভ্যন্তরে কল করতে চান । মতামত এখানে পৃথক, এই প্রশ্নে বিষয়টি আলোচনা করা হয়:
একটি পেয়ারা অবজেক্টস.হ্যাশকোড () বাস্তবায়নে সুপারক্লাসকে যুক্ত করার সঠিক উপায়?
(যদিও এটি প্রায় hashCode()
, একই ক্ষেত্রে প্রযোজ্য equals()
)
দ্রষ্টব্য ( কায়াহারের মন্তব্য দ্বারা অনুপ্রাণিত )
Objects.hashCode(..)
(ঠিক যেমন অন্তর্নিহিত Arrays.hashCode(...)
) খারাপ কাজ করতে পারে আপনার যদি অনেক আদিম ক্ষেত্র থাকে। এই ধরনের ক্ষেত্রে, EqualsBuilder
আসলে ভাল সমাধান হতে পারে।
reflectionEquals
এবংreflectionHashcode
কার্য দ্বারা প্রলোভিত না হন ; কর্মক্ষমতা একটি পরম ঘাতক।