সতর্কতা উত্তরাধিকার সহ @ ডেটা টীকাগুলি লম্বোকের সমান / হ্যাশকোড


103

আমার একটি সত্তা আছে যা অন্যের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। অন্যদিকে, আমি বয়লারপ্লেট কোড হ্রাস করতে লম্বোক প্রজেক্টটি ব্যবহার করছি, তাই আমি @Dataটীকাটি দিয়েছি । টীকা @Dataউত্তরাধিকার সঙ্গে পরবর্তী সতর্কবার্তা উৎপন্ন:

সমান / হ্যাশকোড বাস্তবায়ন উত্পন্ন করা কিন্তু সুপারক্লাসে কল ছাড়াই, যদিও এই শ্রেণিটি java.lang.Object প্রসারিত করে না। এটি যদি উদ্দেশ্যমূলক হয় তবে @EqualsAndHashCode(callSuper=false)আপনার প্রকারে যুক্ত করুন।

এটি টীকা যোগ করার পরামর্শ দেওয়া হয় @EqualsAndHashCode (callSuper = true)বা @EqualsAndHashCode (callSuper = false)? এটা যোগ করা হয়, তাহলে কোনটা তোমার মানিব্যাগ callSuper=falseবা callSuper=true?

উত্তর:


125

ডিফল্ট মান হল false। আপনি যদি এটি নির্দিষ্ট না করেন এবং সতর্কতাটি উপেক্ষা করেন তবে এটিই আপনি পেয়েছেন।

হ্যাঁ, এনটোটেড ক্লাসগুলিতে একটি @EqualsAndHashCodeটীকা যুক্ত করার প্রস্তাব দেওয়া হয়েছে @Dataযা অবজেক্টের চেয়ে অন্য কিছু বাড়িয়ে তোলে। আপনার প্রয়োজন আছে কিনা তা আমি আপনাকে বলতে পারব না trueবা falseএটি আপনার শ্রেণি শ্রেণিবিন্যাসের উপর নির্ভর করে এবং কেস-কেস-কেস ভিত্তিতে পরীক্ষা করা দরকার।

তবে, কোনও প্রকল্প বা প্যাকেজের জন্য, lombok.configযদি এটি কোনও অবজেক্টের সরাসরি সাবক্লাস না হয় তবে সুপার পদ্ধতিগুলিতে কল করতে আপনি কনফিগার করতে পারেন ।

lombok.equalsAndHashCode.callSuper = call

দেখুন কনফিগারেশন সিস্টেম ডকুমেন্টেশন কিভাবে এই কাজ করে, এবং @EqualsEndHashCodeডকুমেন্টেশন সমর্থিত কনফিগারেশন কী জন্য।

প্রকাশ: আমি লম্পোক বিকাশকারী।


আমার জন্য কাজ করেছেন। তবে কেবল মনে রাখবেন যে ডেলম্বোক প্লাগইনটি এই কনফিগার ফাইলটি বাছাই করার জন্য এটি জাভা উত্স রুট ডিরেক্টরিতে স্থাপন করা উচিত, উত্স ডিরেক্টরিতে নয়, যেমন এসআরসি / প্রধান / জাভাতে এবং
এসসিআর

4
@ রোল আমি ভাবছি যে ডিফল্টটি মিথ্যা কেন। আমি বিপরীত আশা করতাম। এছাড়াও, ডিফল্টরূপে সুপার কল করার জন্য স্টস্ট্রিং () পাওয়ার সমতুল উপায় আছে কি? আমি দেখতে পাচ্ছি যে আমি "@ToString (কলসুপার = সত্য)" করতে পারি, তবে এরকম কোনও কনফিগারেশন সেটিংস দেখছি না। ধন্যবাদ
ডেভিড সিগাল

আমি @ ডেটা এর আগে বা পরে @EqualsAndHashCode (কলসুপার = সত্য) যুক্ত করলে কী আসে যায়?
আন্না ক্লেইন 14 ই

@ আন্নাক্লেইন অর্ডারটি কোনও ব্যাপার নয়
ড্যান কার্টার

47

@EqualsAndHashCode(callSuper=true) সতর্কতা সমাধান করা উচিত।


4
এটি যথাযথ উত্তর হওয়া উচিত যেহেতু আমি মনে করি না যে রোলের পরামর্শটি "lombok.equalsAndHashCode.callSuper = কল" করা উচিত, পরিবর্তে প্রতিটি শ্রেণীর জন্য সিদ্ধান্ত নেওয়া উচিত।
আন্না ক্লেইন

4
পছন্দ করেছেন আসলে এই উত্তরটি একটি মন্তব্য হওয়া উচিত, এখানে কোনও নতুন তথ্য নেই, আপনি আমার প্রশ্নের মধ্যে এটি খুঁজে পেতে পারেন। আমি জানতাম @EqualsAndHashCodeসতর্কতার সমাধান করে ol
পাউ

প্রকৃতপক্ষে স্বীকৃত উত্তরের প্রতি (এবং নীচে আমার উত্তর) আপনার টীকাতে 'কলসুপার = ট্রু' বা 'কলসুপার = মিথ্যা' এর মধ্যে বেছে নেওয়া উচিত।
অ্যাডাম ওয়াইজ

27

মূল মূল প্রশ্নটি হ'ল:

@EqualsAndHashCode (কলসুপার = সত্য) বা @ একুয়ালএন্ডহ্যাশকোড (কলসআপার = মিথ্যা) এ টিকা যোগ করার পরামর্শ দেওয়া হচ্ছে কি?

গৃহীত উত্তরটি মূলত:

...এটা নির্ভর করে...

এটিকে প্রসারিত করতে, @EqualsAndHashCode- তে ডকুমেন্টেশনের কিছু দৃ guidance় নির্দেশিকা রয়েছে যার উপর চয়ন করতে হবে। বিশেষত এটি, আইএমএইচও:

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

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


আমি মনে করি এটিই উত্তর যা কলস্পার = মিথ্যা এবং কলসুপার = সত্যের মধ্যে কীভাবে চয়ন করতে পারে তা ভালভাবে ব্যাখ্যা করে।
প্রেজেন্ট করুন

10

আপনি যদি সুপারক্লাসের সদস্যদেরও তুলনা করতে চান তবে ব্যবহার করুন @EqualsAndHashCode(callSuper=true)। তবে, আপনি শুধুমাত্র বর্তমান বর্গ ক্ষেত্র তুলনা করতে চান আপনি ব্যবহার করতে পারেন @EqualsAndHashCode(callSuper=false)যা ডিফল্ট বিকল্প।

আপনি যদি ডেলম্বোক - বৈশিষ্ট্যটি ব্যবহার করেন তবে দেখতে পাবেন যে পার্থক্যটি trueএই লাইনটিতে সেট করার পরে উত্পন্ন সমান পদ্ধতিতে যুক্ত করা হয় if (!super.equals(o)) return false;। সুপারক্লাসে যদি আপনার সদস্য থাকে যা দুটি বস্তুর তুলনা করার সময় বিবেচনা করা উচিত, তবে এটি সঠিকভাবে তুলনা করতে সত্যতে সেট করতে হবে।

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