Optionals, whatever code is provided in the
.orElse will be executed everytime the
Optional is evaluated, not just when the
Optional is empty and the
.orElse would be hit. Sometimes people make the mistake of putting code in the
.orElse that has a side effect that can affect performance (e.g. making a database query to get some kind of default value) or can result in bugs (e.g. running a database query that updates some value that should only be done when the
Optional is empty). In these cases
.orElseGet should be used as it defers execution until the
Optional actually evaluates to empty and the
.orElseGet needs to be run.
See also this popular StackOverflow thread on
.orElseGet where the delayed execution is referenced as one of the main differences
This will call
getDefaultItemFromDB() every time this optional is called, even if
getSpecificItemFromDB returns a non-null value.
Optional.ofNullable(getSpecificItemFromDB(itemId)) .orElseGet(() -> getDefaultItemFromDB())
getDefaultItemFromDB is only called if
getSpecificItemFromDB returns a null value.
To pick up on this, sonar could inspect the contents of
.orElse and check if the value is constant or not