10

I have a function in one of my classes that compares itself with another instance of the same class - and finds out which variables differ. This is for the purpose of minimizing network load with a main database (by only uploading data that needs to be uploaded, instead of uploading the whole object).

For this, I have been trying to make use of the object.equals() function to compare the two objects.

I soon found that the object.equals() does not handle nulls, and after reading this question, I understand why.

So an example of my broken code is as follows:

public class MyObject {

    String myString;
    String myString2;

    public String getChangedVars(MyObject comparisonObj) {
        ArrayList<String> changedVars = new ArrayList<String>();

        if (!this.myString.equals(comparisonObj.myString))
            changedVars.add("myString");
        if (!this.myString2.equals(comparisonObj.myString2))
            changedVars.add("myString2");

        return changedVars.toString();
    }
}

My question is - on the basis that either one of the variables being compared could be null, what is a simple way to compare two variables whilst avoiding a NullPointerException?

Edit: Simply checking for null on both objects first doesn't work well, as I still want to compare if the object has a reference or not. Eg, if one item is null and the other is not, I want this to resolve to true, as the variable has changed.

Community
  • 1
  • 1
Mike Baxter
  • 6,868
  • 17
  • 67
  • 115

4 Answers4

30

There is new utility class available in jdk since 1.7 that is Objects .

This class consists of static utility methods for operating on objects. These utilities include null-safe or null-tolerant methods for computing the hash code of an object, returning a string for an object, and comparing two objects.

You can use Objects.equals, it handles null.

Objects.equals(Object a, Object b) Returns true if the arguments are equal to each other and false otherwise. Consequently, if both arguments are null, true is returned and if exactly one argument is null, false is returned. Otherwise, equality is determined by using the equals method of the first argument.

if(Objects.equals(myString,myString2)){...}
Subhrajyoti Majumder
  • 40,646
  • 13
  • 77
  • 103
  • 3
    Aah .. Something new. +1. – Suresh Atta Feb 04 '14 at 09:33
  • What a shame, this solution is great - unfortunately I don't seem to have access to the `Objects` class within Android - however as I didn't specify that this was an Android question (I honestly didn't think it was relevant) - then I will accept this answer anyway. Thanks! – Mike Baxter Feb 04 '14 at 09:40
1

You can use Apache object utils

ObjectUtils.equals(Object object1, Object object2) -- Returns boolean

this method has been replaced by java.util.Objects.equals(Object, Object) in Java 7

gowtham
  • 977
  • 7
  • 15
0
    if (this.myString != null && this.myString.equals(comparisonObj.myString))
{
                changedVars.add("myString");
}
Kick
  • 4,823
  • 3
  • 22
  • 29
0

Use StringUtils provided by apache

StringUtils.equals(myString,comparisonObj.myString);
Pratik Shelar
  • 3,154
  • 7
  • 31
  • 51