user15348067
user15348067

Reputation: 53

How to check if a java method returns null without having to run it twice

I have this situation many times in my code,

I have a method for example such as:

private Object doSomething(){
//Do something
doSomething ? return Object : return null;
}

This is just an example, then in the main body of my code I need to check that this doesn't return null before I do something else. For example:

if(doSomething() != null){

Object object = doSomething();

From a performance perspective this method is being asked to run twice, once to check it doesn't return null and next to assign the new variable as long as it returns a valid object.

Is there a way to develop this code where this double running doesn't have to take place. Bearing in mind that the check to make sure the object is valid is important in the code.

Upvotes: 2

Views: 7539

Answers (2)

vsfDawg
vsfDawg

Reputation: 1527

Consider using Optional rather than returning null (introduced with Java 8).

public Optional<Object> doSomething() {
  return Optional.ofNullable(someData);
}

When invoked, you have an Optional reference that may (or may not) have contents.

Optional<Object> maybeSomething = doSomething();
if (maybeSomething.isPresent()) {
  Object someData = maybeSomething.get();
  System.out.println("SomeData = "+someData);
}

Optional blends well with lambda so you could rewrite that as..

Optional<Object> maybeSomething = doSomething();
maybeSomething.ifPresent(someData ->  System.out.println("SomeData = " + someData);

or, if you don't need to do more work with someData you could even do

doSomething().ifPresent(someData -> System.out.println("SomeData = " + someData);

Upvotes: 2

Federico klez Culloca
Federico klez Culloca

Reputation: 27119

Just reverse the process. First assign the result of that call to a variable, then check if the variable is null.

Object object = doSomething();
if (object != null) {
    // do whatever with object
} else {
    // do something else
}

It is worth noting that the problem with multiple calls to doSomething may not only be a performance penalty. It could also be a problem if:

  1. doSomething has side effects, for example if it inserts a row in a database, in which case calling it twice will insert two rows.
  2. doSomething depends on some external state which may change between invocations.

Upvotes: 5

Related Questions