Search code examples
javacloneequals

Clone implementation not passing 'equals' test, all variables/fields are the same when debugging


I'm doing a homework assignment to pass a series of tests, I implemented my own equals and clone function, and can't figure out why the cloned object isn't equal to the original.

I've tried casting the Object to Student in the boolean expression of the if statement, but that hasn't done anything.

Testfile

Name n1 = new Name("John","Rockefeller");
Student s1 = new Student(n1, "123456");
Student s3 = s1.clone();
if ( s1.equals ( s3 ) )
        System.out.println ( "\t\tSuccess - Students s1 and s3 are the same." );

class Student implements Cloneable

private Name fullName;
private String id;

@Override
    public Student clone(){
        try {
            Student clone = (Student) super.clone();

            clone.fullName = (Name) fullName.clone();
            return clone;
        } catch (CloneNotSupportedException e) {
            System.out.println("Error: " + e);
            return null;
        }
    }

public boolean equals ( Object obj ) {
        if (this == (Student) obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Student calc = (Student) obj;

        return Objects.equals(this.fullName, calc.fullName) && Objects.equals(this.id, calc.id);
    }

Expected: The test passes, however after watching the variables in the debugging tracker I have no idea why it's not passing. The values are equal.


Solution

  • Your clone method does not copy id. Your equals method expects the ids to be equal.