জাভাতে সমান পদ্ধতিতে কীভাবে ওভাররাইড করা যায়


108

আমি জাভাতে সমান পদ্ধতিতে ওভাররাইড করার চেষ্টা করছি। আমার একটি ক্লাস রয়েছে Peopleযার মূলত 2 ডেটা ফিল্ড রয়েছে nameএবং age। এখন আমি equalsপদ্ধতিটি ওভাররাইড করতে চাই যাতে আমি 2 জন ব্যক্তির বস্তুর মধ্যে পরীক্ষা করতে পারি।

আমার কোডটি নিম্নরূপ

public boolean equals(People other){
    boolean result;
    if((other == null) || (getClass() != other.getClass())){
        result = false;
    } // end if
    else{
        People otherPeople = (People)other;
        result = name.equals(other.name) &&  age.equals(other.age);
    } // end else

    return result;
} // end equals

তবে আমি যখন age.equals(other.age)এটি লিখি তা আমাকে ত্রুটি দেয় কারণ সমান পদ্ধতিটি কেবল স্ট্রিংয়ের সাথে তুলনা করতে পারে এবং বয়সটি পূর্ণসংখ্যা।

সমাধান

==প্রস্তাবিত হিসাবে আমি অপারেটরটি ব্যবহার করেছি এবং আমার সমস্যাটির সমাধান হয়েছে।


3
আরে কেমন আছে এই.এজ == অন্যান্য.এজ সম্পর্কে? :)
denis.solonenko

1
বয়সের জন্য ডেটা টাইপ কি? int বা পূর্ণসংখ্যা? এছাড়াও, আপনি জেডিকে কোন সংস্করণ ব্যবহার করছেন?
মণীশ

2
"সমান পদ্ধতিতে কেবল স্ট্রিংকে তুলনা করা যায়" - কে আপনাকে বলেছিল সমান পদ্ধতিটি কেবল স্ট্রিংকে তুলনা করতে পারে? সমতুল্য পদ্ধতিটি অবজেক্ট শ্রেণীর অন্তর্ভুক্ত এবং যে কোনও শ্রেণি তৈরি করা হলে ডিফল্টরূপে সমান প্রয়োগ হয়। আপনি যে কোনও জাভা ক্লাসে সমান কল করতে পারেন
মণীশ

উত্তর:


127
//Written by K@stackoverflow
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        ArrayList<Person> people = new ArrayList<Person>();
        people.add(new Person("Subash Adhikari", 28));
        people.add(new Person("K", 28));
        people.add(new Person("StackOverflow", 4));
        people.add(new Person("Subash Adhikari", 28));

        for (int i = 0; i < people.size() - 1; i++) {
            for (int y = i + 1; y <= people.size() - 1; y++) {
                boolean check = people.get(i).equals(people.get(y));

                System.out.println("-- " + people.get(i).getName() + " - VS - " + people.get(y).getName());
                System.out.println(check);
            }
        }
    }
}

//written by K@stackoverflow
    public class Person {
        private String name;
        private int age;

        public Person(String name, int age){
            this.name = name;
            this.age = age;
        }

        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }

            
if (obj.getClass() != this.getClass()) {
                return false;
            }



            final Person other = (Person) obj;
            if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
                return false;
            }

            if (this.age != other.age) {
                return false;
            }

            return true;
        }

        @Override
        public int hashCode() {
            int hash = 3;
            hash = 53 * hash + (this.name != null ? this.name.hashCode() : 0);
            hash = 53 * hash + this.age;
            return hash;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

আউটপুট:

সঞ্চালন করুন:

- সুভাষ অধিকারী - ভিএস - কে মিথ্যা

- সুবাশ অধিকারী - ভিএস - স্ট্যাকওভারফ্লো মিথ্যা

- সুভাষ অধিকারী - ভিএস - সুবাশ অধিকারী সত্য

- কে - ভিএস - স্ট্যাকওভারফ্লো মিথ্যা

- কে - ভিএস - সুবাশ অধিকারী মিথ্যা

- স্ট্যাকওভারফ্লো - ভিএস - সুবাশ অধিকারী মিথ্যা

- বিল্ড সাফল্য (মোট সময়: 0 সেকেন্ড)


7
কি hash = 53 * hashএটা কেন ব্যবহার করা হয়?
কিট্টু

2
getClass()ক্লাসটি সাবক্ল্যাসড হয়ে গেলে এবং সুপার-ক্লাসের কোনও অবজেক্টের সাথে তুলনা করা হলে ব্যবহার সমস্যা তৈরি করতে চলেছে।
টাক্সডুড

1
বেকোজ prime হ'ল প্রাইম নম্বর , এই উত্তরটি দেখুন stackoverflow.com/a/27609/3425489 , তিনি সংখ্যা নির্বাচন করার সময় মন্তব্য করেছিলেনhashCode()
শান্তারাম টুপে

1
এই প্রশ্নে বিজয়ী উত্তর কেন তুমি হ্যাশকোড (ওভাররাইড একটি চমৎকার ব্যাখ্যা আছে) stackoverflow.com/a/27609/1992108
Pegasaurus

7
instanceofঅপারেটর ব্যবহার না করে বা (getClass ()! = Obj.getClass ()) ... ব্যবহার করার কথা বিবেচনা করুন isAssignableFrom। এর জন্য সাব টাইপ ম্যাচের পরিবর্তে হুবহু টাইপ ম্যাচ প্রয়োজন। - প্রতিসম প্রয়োজন। এছাড়াও Stringঅন্যান্য অবজেক্টের সাথে তুলনা করতে বা ব্যবহার করতে পারেন Objects.equals(this.name,other.name)
YoYo

22

একটি নতুন পদ্ধতির স্বাক্ষরের পরিচয় দেওয়া যা পরামিতিগুলির ধরণের পরিবর্তন করে তাকে ওভারলোডিং বলা হয় :

public boolean equals(People other){

এখানে Peopleচেয়ে আলাদা Object

যখন কোনও পদ্ধতির স্বাক্ষর তার সুপারক্লাসের অনুরূপ থেকে যায়, তখন এটিকে ওভাররাইডিং বলা হয় এবং @Overrideটীকাটি সংকলনের সময় দুটি পৃথক করতে সহায়তা করে:

@Override
public boolean equals(Object other){

প্রকৃত ঘোষণা না দেখে ageত্রুটি কেন উপস্থিত হয় তা বলা মুশকিল।


18

আপনি পুরো কোডটি পোস্ট করেননি বলে আমি বিশদ সম্পর্কে নিশ্চিত নই, তবে:

  • hashCode()পাশাপাশি ওভাররাইড মনে রাখবেন
  • equalsপদ্ধতি থাকা উচিত Objectনয়, Peopleযুক্তি টাইপ হিসাবে। এই মুহুর্তে আপনি ওভারলোডিং করছেন, ওভাররাইড করছেন না, সমান পদ্ধতি, যা সম্ভবত আপনি চান তা নয়, বিশেষত আপনাকে পরবর্তী ধরণের পরীক্ষা করে দেখার পরে।
  • আপনি instanceofএটি চেক করতে ব্যবহার করতে পারেন এটি একটি জনগণের উদ্যান egif (!(other instanceof People)) { result = false;}
  • equalsসমস্ত বস্তুর জন্য ব্যবহৃত হয়, তবে আদিম নয়। আমি মনে করি আপনার মানে বয়স একটি int(আদিম), সেক্ষেত্রে কেবল ব্যবহার ==। মনে রাখবেন যে একটি পূর্ণসংখ্যা (মূলধন 'I' সহ) এমন একটি বস্তু যা সমানের সাথে তুলনা করা উচিত।

দেখুন কি বিষয় বিবেচনা করা উচিত যখন জাভা সমান এবং হ্যাশকোড অগ্রাহ্য? আরো বিস্তারিত জানার জন্য.


12
@Override
public boolean equals(Object that){
  if(this == that) return true;//if both of them points the same address in memory

  if(!(that instanceof People)) return false; // if "that" is not a People or a childclass

  People thatPeople = (People)that; // than we can cast it to People safely

  return this.name.equals(thatPeople.name) && this.age == thatPeople.age;// if they have the same name and same age, then the 2 objects are equal unless they're pointing to different memory adresses
}

12

আইটেম 10: সমান ওভাররাইড করার সময় সাধারণ চুক্তি মেনে চলুন

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

  • শ্রেণীর প্রতিটি উদাহরণ সহজাত অনন্য । এটি থ্রেডের মতো শ্রেণীর ক্ষেত্রে সত্য যা মানগুলির চেয়ে সক্রিয় সত্তাকে উপস্থাপন করে। অবজেক্ট দ্বারা সরবরাহ করা সমান বাস্তবায়ন এই শ্রেণীর জন্য ঠিক সঠিক আচরণ করে।

  • শ্রেণীর জন্য "যৌক্তিক সাম্য" পরীক্ষা দেওয়ার প্রয়োজন নেই। উদাহরণস্বরূপ, java.util.regex.Pattern দুটি প্যাটার্ন দৃষ্টান্তগুলি একই নিয়মিত অভিব্যক্তির প্রতিনিধিত্ব করে কিনা তা পরীক্ষা করার জন্য ওভাররাইড সমান হতে পারে, তবে ডিজাইনাররা ভাবেন নি যে ক্লায়েন্টদের এই কার্যকারিতা প্রয়োজন হবে বা চাইবে। এই পরিস্থিতিতে অবজেক্ট থেকে উত্তরাধিকারসূত্রে সমান বাস্তবায়ন আদর্শ।

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

  • ক্লাসটি বেসরকারী বা প্যাকেজ-ব্যক্তিগত , এবং আপনি নিশ্চিত যে এর সমান পদ্ধতিটি কখনই আর চাওয়া হবে না। যদি আপনি চূড়ান্ত ঝুঁকি-বিপর্যস্ত হন তবে আপনি এটি দুর্ঘটনাক্রমে আহবান করা হয়নি তা নিশ্চিত করার জন্য সমান পদ্ধতিটি ওভাররাইড করতে পারেন:

equalsপদ্ধতি একটি সমানতা সম্পর্ক বাস্তবায়ন করছে। এর এই বৈশিষ্ট্যগুলি রয়েছে:

  • আত্মবাচক: যেকোনো অ নাল রেফারেন্স মান জন্য x, x.equals(x)সত্য ফিরে আসবে।

  • প্রতিসম: কোনও নন-নাল রেফারেন্স মানগুলির জন্য xএবং y, x.equals(y)যদি y.equals (x) সত্য প্রত্যাবর্তন করে তবে অবশ্যই সত্যটি ফিরে আসতে হবে।

  • সকর্মক: যেকোনো অ নাল রেফারেন্স মান জন্য x, y, z, যদি x.equals(y)আয় trueএবং y.equals(z)আয় true, তারপর x.equals(z)ফিরে আসবে true

  • সামঞ্জস্যপূর্ণ: কোনও নন-নাল রেফারেন্স মানগুলির জন্য xএবং yএকাধিক অনুরোধের x.equals(y)ধারাবাহিকভাবে ফিরে আসতে হবে trueবা ধারাবাহিকভাবে ফিরে আসতে হবে false, সমান তুলনায় ব্যবহৃত কোনও তথ্য সংশোধিত না হয় provided

  • যে কোনও নন-নাল রেফারেন্স মানের জন্য x, x.equals(null)অবশ্যই ফিরে আসতে হবে false

এখানে উচ্চ-মানের সমান পদ্ধতির একটি রেসিপি দেওয়া হয়েছে:

  1. ==আর্গুমেন্টটি এই অবজেক্টের কোনও রেফারেন্স কিনা তা পরীক্ষা করতে অপারেটরটি ব্যবহার করুন । যদি তাই হয়, সত্য ফিরে। এটি কেবল একটি পারফরম্যান্স অপটিমাইজেশন তবে তুলনাটি সম্ভাব্য ব্যয়বহুল হলে এটি করার পক্ষে উপযুক্ত।

  2. instanceofযুক্তিটির সঠিক ধরণ আছে কিনা তা পরীক্ষা করতে অপারেটরটি ব্যবহার করুন । যদি না হয়, মিথ্যা ফিরে। সাধারণত, সঠিক টাইপটি ক্লাস হয় যেখানে পদ্ধতিটি ঘটে। কখনও কখনও, এটি এই শ্রেণীর দ্বারা প্রয়োগ করা কিছু ইন্টারফেস। একটি ইন্টারফেস ব্যবহার করুন যদি শ্রেণিটি এমন ইন্টারফেস প্রয়োগ করে যা ইন্টারফেস প্রয়োগ করে এমন ক্লাসগুলিতে তুলনাকে অনুমতি দেওয়ার সমান চুক্তিকে পরিমার্জন করে। সেট, তালিকা, মানচিত্র এবং মানচিত্রের মতো সংগ্রহের ইন্টারফেসগুলিতে এই বৈশিষ্ট্য রয়েছে nt

  3. সঠিক প্রকারে যুক্তিটি কাস্ট করুন। যেহেতু এই কাস্টটি পরীক্ষার আগে হয়েছিল, এটি সফল হওয়ার গ্যারান্টিযুক্ত।

  4. ক্লাসের প্রতিটি "উল্লেখযোগ্য" ক্ষেত্রের জন্য, আর্গুমেন্টের সেই ক্ষেত্রটি এই বস্তুর সাথে সম্পর্কিত ক্ষেত্রের সাথে মেলে কিনা তা পরীক্ষা করুন। যদি এই সমস্ত পরীক্ষা সফল হয়, সত্য ফিরে আসুন; অন্যথায়, মিথ্যা ফিরে। পদক্ষেপ 2 এ টাইপটি যদি একটি ইন্টারফেস হয় তবে আপনাকে অবশ্যই ইন্টারফেস পদ্ধতির মাধ্যমে যুক্তির ক্ষেত্রগুলি অ্যাক্সেস করতে হবে; প্রকারটি যদি শ্রেণি হয় তবে আপনি তাদের ক্ষেত্রের অ্যাক্সেসযোগ্যতার উপর নির্ভর করে সরাসরি ক্ষেত্রগুলি অ্যাক্সেস করতে সক্ষম হতে পারেন।

  5. আদিম ক্ষেত্রগুলির জন্য যাদের প্রকারটি নয় floatবা double, ==তুলনা করার জন্য অপারেটরটি ব্যবহার করুন ; অবজেক্ট রেফারেন্স ক্ষেত্রগুলির জন্য, equalsপদ্ধতিটিকে পুনরাবৃত্তভাবে কল করুন ; floatক্ষেত্রগুলির জন্য , স্থির Float.compare(float, float)পদ্ধতিটি ব্যবহার করুন ; এবং doubleক্ষেত্রের জন্য , ব্যবহার Double.compare(double, double)। ভাসা এবং ডাবল ক্ষেত্র বিশেষ চিকিত্সা অস্তিত্ব দ্বারা প্রয়োজনীয় তৈরি করা হয় Float.NaN, -0.0fএবং অনুরূপ ডবল মান; আপনি স্থির পদ্ধতিগুলির সাথে তুলনা করতে floatএবং doubleক্ষেত্রগুলি করতে পারতেন Float.equalsএবং Double.equals, এটি প্রতিটি তুলনাতে অটোবক্সিংকে জড়িত করতে পারে, এতে খারাপ পারফরম্যান্স হবে। জন্য arrayক্ষেত্র, প্রতিটি উপাদানে এই নির্দেশিকাগুলি প্রয়োগ করুন। যদি অ্যারে ক্ষেত্রে প্রতিটি উপাদান উল্লেখযোগ্য হয় তবে একটি Arrays.equalsপদ্ধতি ব্যবহার করুন।

  6. কিছু বস্তুর রেফারেন্স ক্ষেত্রগুলি বৈধভাবে থাকতে পারে null। ক এর সম্ভাবনা এড়াতে NullPointerExceptionস্থির পদ্ধতি ব্যবহার করে সমতার জন্য এই জাতীয় ক্ষেত্রগুলি পরীক্ষা করুন Objects.equals(Object, Object)

    // Class with a typical equals method
    
    public final class PhoneNumber {
    
        private final short areaCode, prefix, lineNum;
    
        public PhoneNumber(int areaCode, int prefix, int lineNum) {
    
            this.areaCode = rangeCheck(areaCode,  999, "area code");
    
            this.prefix   = rangeCheck(prefix,    999, "prefix");
    
            this.lineNum  = rangeCheck(lineNum,  9999, "line num");
    
        }
    
        private static short rangeCheck(int val, int max, String arg) {
    
            if (val < 0 || val > max)
    
               throw new IllegalArgumentException(arg + ": " + val);
    
            return (short) val;
    
        }
    
        @Override public boolean equals(Object o) {
            if (o == this)
                return true;
            if (!(o instanceof PhoneNumber))
                return false;
            PhoneNumber pn = (PhoneNumber)o;
            return pn.lineNum == lineNum && pn.prefix == prefix
                    && pn.areaCode == areaCode;
        }
        ... // Remainder omitted
    
    }

1
আপনাকে hashCode()পাশাপাশি ওভাররাইড করতে হবে তা উল্লেখ করতে ভুলবেন না । আরো উল্লেখ্য, যে Java7 লেখা যেহেতু equals()এবং hashCode()পদ্ধতি অনেক সহজ ব্যবহার করার মাধ্যমে পরিণত হয়েছে Objects.equals(), Arrays.equals()এবং Objects.hashCode(), Arrays.hashCode()
আর্নল্ড শ্রিজার

3
if (getClass() != obj.getClass()) ...উদাহরণস্বরূপ অপারেটর ব্যবহার না করে ব্যবহার করার কথা বিবেচনা করুন । এর জন্য সাব টাইপ ম্যাচের পরিবর্তে হুবহু টাইপ ম্যাচ প্রয়োজন । - প্রতিসম প্রয়োজন।
YoYo

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

5

যেহেতু আমি অনুমান করছি ageপ্রকারের int:

public boolean equals(Object other){
    boolean result;
    if((other == null) || (getClass() != other.getClass())){
        result = false;
    } // end if
    else{
        People otherPeople = (People)other;
        result = name.equals(otherPeople.name) &&  age == otherPeople.age;
    } // end else

    return result;
} // end equals

এর ফলে NullPointerExceptionযদি nameহয় তবে কিছু হবে null
ওরিয়ান

@orien নেই একটি বড় চুক্তি, হয়তো এটা যে চুক্তি হয় nameএকটি নির্ধারিত পরার কখনো nullমান ...
ফোরট্রান

@ ফিফর্টান তাই ... সম্ভবত এটি কোনও বড় বিষয় নয়;)
ওরিয়েন

5

জাভাতে অবজেক্টগুলির সাথে তুলনা করার সময়, আপনি একটি শব্দার্থ চেক করেন , প্রকারের সাথে তুলনা করে এবং রাষ্ট্রের শনাক্তকরণ অবজেক্টের :

  • নিজেই (একই উদাহরণ)
  • নিজেই (ক্লোন বা পুনর্গঠিত অনুলিপি)
  • বিভিন্ন ধরণের অন্যান্য বস্তু
  • একই ধরণের অন্যান্য অবজেক্ট
  • null

নিয়মাবলী:

  • প্রতিসম :a.equals(b) == b.equals(a)
  • equals()সবসময় উৎপাদ trueবা falseকরি কিন্তু সেই NullpointerException, ClassCastExceptionবা অন্য কোন নিক্ষেপযোগ্য

তুলনা:

  • টাইপ চেক : উভয় দৃষ্টান্ত একই ধরণের হওয়া দরকার যার অর্থ আপনাকে সাম্যের জন্য প্রকৃত শ্রেণীর তুলনা করতে হবে। এটি প্রায়শই সঠিকভাবে প্রয়োগ করা হয় না, যখন বিকাশকারীরা instanceofপ্রকার তুলনা করার জন্য ব্যবহার করে (যা কেবল তখন পর্যন্ত কাজ করে যখন কোনও সাবক্লাস নেই, এবং যখন প্রতিসম নিয়ম লঙ্ঘন করে A extends B -> a instanceof b != b instanceof a)
  • শনাক্তকরণের স্থিতিক চেক : নিশ্চিত করুন যে কোন রাজ্যের দ্বারা দৃষ্টান্তগুলি সনাক্ত করা হয়েছে তা আপনি বুঝতে পেরেছেন। ব্যক্তিরা তাদের সামাজিক সুরক্ষা নম্বর দ্বারা চিহ্নিত হতে পারে তবে চুলের রঙ (রঙ করা যায় না), নাম (পরিবর্তন করা যেতে পারে) বা বয়স (সমস্ত সময় পরিবর্তন হয়) দ্বারা নয়। কেবলমাত্র মান অবজেক্টের সাথে আপনার সম্পূর্ণ রাষ্ট্রের (সমস্ত অস্থায়ী ক্ষেত্র) তুলনা করা উচিত, অন্যথায় উদাহরণটি কী তা চিহ্নিত করে কেবল তা পরীক্ষা করুন।

আপনার Personশ্রেণীর জন্য:

public boolean equals(Object obj) {

    // same instance
    if (obj == this) {
        return true;
    }
    // null
    if (obj == null) {
        return false;
    }
    // type
    if (!getClass().equals(obj.getClass())) {
        return false;
    }
    // cast and compare state
    Person other = (Person) obj;
    return Objects.equals(name, other.name) && Objects.equals(age, other.age);
}

পুনরায় ব্যবহারযোগ্য, জেনেরিক ইউটিলিটি শ্রেণি:

public final class Equals {

    private Equals() {
        // private constructor, no instances allowed
    }

    /**
     * Convenience equals implementation, does the object equality, null and type checking, and comparison of the identifying state
     *
     * @param instance       object instance (where the equals() is implemented)
     * @param other          other instance to compare to
     * @param stateAccessors stateAccessors for state to compare, optional
     * @param <T>            instance type
     * @return true when equals, false otherwise
     */
    public static <T> boolean as(T instance, Object other, Function<? super T, Object>... stateAccessors) {
        if (instance == null) {
            return other == null;
        }
        if (instance == other) {
            return true;
        }
        if (other == null) {
            return false;
        }
        if (!instance.getClass().equals(other.getClass())) {
            return false;
        }
        if (stateAccessors == null) {
            return true;
        }
        return Stream.of(stateAccessors).allMatch(s -> Objects.equals(s.apply(instance), s.apply((T) other)));
    }
}

আপনার Personশ্রেণীর জন্য, এই ইউটিলিটি ক্লাসটি ব্যবহার করে:

public boolean equals(Object obj) {
    return Equals.as(this, obj, t -> t.name, t -> t.age);
}

1

বয়স যদি আন্ত হয় তবে আপনার == ব্যবহার করা উচিত যদি এটি পূর্ণসংখ্যার বস্তু হয় তবে আপনি সমান () ব্যবহার করতে পারেন। আপনি যদি সমানভাবে ওভাররাইড করেন তবে আপনাকে হ্যাশকোড পদ্ধতিও প্রয়োগ করতে হবে। চুক্তির বিবরণ অবজেক্টের জাভাদোক এবং ওয়েবে বিভিন্ন পৃষ্ঠায় উপলভ্য।


0

আমি সম্প্রতি যে সমাধানটি ব্যবহার করেছি তা এখানে:

public class Test {
    public String a;
    public long b;
    public Date c;
    public String d;
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Test)) {
            return false;
        }
        Test testOther = (Test) obj;
        return (a != null ? a.equals(testOther.a) : testOther.a == null)
                && (b == testOther.b)
                && (c != null ? c.equals(testOther.c) : testOther.c == null)
                && (d != null ? d.equals(testOther.d) : testOther.d == null);
    }

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