Question

I was solving some questions for my OCA prepration. I found this problem at Oracle's website listing sample questions for exam.

Code:

public class MyStuff {
    MyStuff(String n) { name = n; }
    String name;
    public static void main(String[] args) {
        MyStuff m1 = new MyStuff("guitar");
        MyStuff m2 = new MyStuff("tv");
        System.out.println(m2.equals(m1));
    }
    public boolean equals(Object o) {
        MyStuff m = (MyStuff)o;
        if(m.name != null) return true;
        return false;
    }
}

Question:

What is the result?

  1. The output is "true" and MyStuff fulfills the Object.equals() contract.
  2. The output is "false" and MyStuff fulfills the Object.equals() contract.
  3. The output is "true" and MyStuff does NOT fulfill the Object.equals() contract.
  4. The output is "false" and MyStuff does NOT fulfill the Object.equals() contract.
  5. Compilation fails.
  6. An exception is thrown at run time.

Answer is-

3. The output is "true" and MyStuff does NOT fulfill the Object.equals() contract.

I understand how, and why the output is true, but what I am not getting is that How come it does not fullfill the Object.equals() contract, and what exactly is a "Contract" in Java, and what if we don't abide by it?

Was it helpful?

Solution 2

The contract here has the english meaning as well as the convention of "design by contract". The contract in terms of equals() and hashcode() method is found on the javadocs of Object - I am assuming you have read it.

The wikipedia page is a must read for better understanding of "design by contract" paradigm. In Java, interfaces are typically defined to establish a contract which the implementation classes then have to abide by.

OTHER TIPS

The equals method implements an equivalence relation on non-null object references:

  1. It is reflexive: for any non-null reference value x, x.equals(x) should return true.
  2. It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
  3. It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
  4. It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified. For any non-null reference value x, x.equals(null) should return false.

The below method doesn't fulfill this obligation For any non-null reference value x, x.equals(null) should return false.

public boolean equals(Object o) {
    MyStuff m = (MyStuff)o;
    if(m.name != null) return true;
    return false;
}

This will throw a ClassCastException , if o is null , it should ideally return false.

Read this documentation on equals method of Object

User scorpion answered what a contract is.

if you don't full fill the contract, them your code might behave unexptected e.g when you use java Collections. I remember one of my collegues said: This java Collection has a bug, it does not work. But the bug was his equals method, not working togehther with hashcode()

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top