What is the best way to know if all the variables in a Class are null?
This can be done fairly easily using a Lombok generated equals
and a static EMPTY
object:
import lombok.Data;
public class EmptyCheck {
public static void main(String[] args) {
User user1 = new User();
User user2 = new User();
user2.setName("name");
System.out.println(user1.isEmpty()); // prints true
System.out.println(user2.isEmpty()); // prints false
}
@Data
public static class User {
private static final User EMPTY = new User();
private String id;
private String name;
private int age;
public boolean isEmpty() {
return this.equals(EMPTY);
}
}
}
Prerequisites:
- Default constructor should not be implemented with custom behavior as that is used to create the
EMPTY
object - All fields of the class should have an implemented
equals
(built-in Java types are usually not a problem, in case of custom types you can use Lombok)
Advantages:
- No reflection involved
- As new fields added to the class, this does not require any maintenance as due to Lombok they will be automatically checked in the
equals
implementation - Unlike some other answers this works not just for null checks but also for primitive types which have a non-null default value (e.g. if field is
int
it checks for0
, in case ofboolean
forfalse
, etc.)
If you want this for unit testing I just use the hasNoNullFieldsOrProperties()
method from assertj
assertThat(myObj).hasNoNullFieldsOrProperties();
Another non-reflective solution for Java 8, in the line of paxdiabo's answer but without using a series of if
's, would be to stream all fields and check for nullness:
return Stream.of(id, name)
.allMatch(Objects::isNull);
This remains quite easy to maintain while avoiding the reflection hammer.
Try something like this:
public boolean checkNull() throws IllegalAccessException {
for (Field f : getClass().getDeclaredFields())
if (f.get(this) != null)
return false;
return true;
}
Although it would probably be better to check each variable if at all feasible.