So, my question is - are those changes to Optional adding some benefits ...
Well there are definitely advantages and disadvantages for both approaches:
Looking from the Optional side, the main "plus" is that you eliminate a major source of bugs; i.e. NPE's caused by not dealing with a possible returned null correctly. The main "minuses" are the verbosity of code that uses Optional, and that it doesn't actually eliminate all bugs; e.g. if you call Optional.get on an "empty" Optional you will get an exception.
Other Q&A's go into more detail:
- Null check vs Optional is present check
- Uses for Optional
- Optional vs. null. What is the purpose of Optional in Java 8?
- Is using Optional.ofNullable as a replacement for the ternary operator a good practice?
... or we are just following fashion without thinking.
That is a different question!
Now I imagine some people may be using Optional without thinking, but I don't see much evidence of that. It is clear that there are advantages AND disadvantages, and that thought is required.
So you should really be asking (yourself!) if >>you<< just following fashion without thinking? Or to put it another way, are you just treating this as a (so-called) "best practice", or are you making a reasoned choice between the two approaches depending on the context?
I have got a suggestion to rewrite everything [in my example] using
Optional.
Here's what I suggest.
- Create a branch in your version control system.
- In the branch, change your API method to use
Optional, and change all of the places in your code that use the API method. - Make a judgement: has this improved things? was the effort worth it?
- If the API is currently or going to used by other people's code, ask their opinions too.
- Decide whether to proceed or not, implement decision, and move on to the next issue.
If that sounds like too much work, another option is to quietly ignore that suggestion.
Either way, we (the StackOverflow community) can't decide for you. We don't have the context1, and even if we did, there would be a range of opinions and no clear correct answer.
1 - For instance, what is the likelihood of there being no locale, and no determinable language. What the application as a whole should do about it? Should it bail out? Should it substitute a default? Could the default be substituted ... here? We can't see "the big picture".
Answer from Stephen C on Stack OverflowSo, my question is - are those changes to Optional adding some benefits ...
Well there are definitely advantages and disadvantages for both approaches:
Looking from the Optional side, the main "plus" is that you eliminate a major source of bugs; i.e. NPE's caused by not dealing with a possible returned null correctly. The main "minuses" are the verbosity of code that uses Optional, and that it doesn't actually eliminate all bugs; e.g. if you call Optional.get on an "empty" Optional you will get an exception.
Other Q&A's go into more detail:
- Null check vs Optional is present check
- Uses for Optional
- Optional vs. null. What is the purpose of Optional in Java 8?
- Is using Optional.ofNullable as a replacement for the ternary operator a good practice?
... or we are just following fashion without thinking.
That is a different question!
Now I imagine some people may be using Optional without thinking, but I don't see much evidence of that. It is clear that there are advantages AND disadvantages, and that thought is required.
So you should really be asking (yourself!) if >>you<< just following fashion without thinking? Or to put it another way, are you just treating this as a (so-called) "best practice", or are you making a reasoned choice between the two approaches depending on the context?
I have got a suggestion to rewrite everything [in my example] using
Optional.
Here's what I suggest.
- Create a branch in your version control system.
- In the branch, change your API method to use
Optional, and change all of the places in your code that use the API method. - Make a judgement: has this improved things? was the effort worth it?
- If the API is currently or going to used by other people's code, ask their opinions too.
- Decide whether to proceed or not, implement decision, and move on to the next issue.
If that sounds like too much work, another option is to quietly ignore that suggestion.
Either way, we (the StackOverflow community) can't decide for you. We don't have the context1, and even if we did, there would be a range of opinions and no clear correct answer.
1 - For instance, what is the likelihood of there being no locale, and no determinable language. What the application as a whole should do about it? Should it bail out? Should it substitute a default? Could the default be substituted ... here? We can't see "the big picture".
I would say Optional is good when your code knows how to deal with the null situation. For example you can write
public String helloWorld(Optional<Long> input){
String toReturn = "Hello "+ input.orElse("0")+ " times";
return toReturn;
}
However, if you are interfacing with legacy code and those functions expect null inputs, which force you to write something like
if(someOptional.isPresent()){
return somevalue;
} else{
return null;
}
In the above case, Optional does not bring you more than using null only. In this case I would use null over Optional.
I am currently working on a SDK/library that has various methods(a lot actually) that are not always guaranteed to return something(based on availability, case,...). I did a lot of research and i just can't decide on which design is more user friendly & stable? So Reddit, whats your opinion on this?
java - Optional Type returns a null value - Stack Overflow
Optional vs. null. What is the purpose of Optional in Java 8? - Stack Overflow
Why exactly does Brian Goetz not recommend the use of Optional everywhere a value could be null?
Method return Optional or null?
Videos
Optional harnesses the type system for doing work that you'd otherwise have to do all in your head: remembering whether or not a given reference may be null. This is good. It's always smart to let the compiler handle boring drugework, and reserve human thought for creative, interesting work.
Without Optional, every reference in your code is like an unexploded bomb. Accessing it may do something useful, or else it may terminate your program wth an exception.
With Optional and without null, every access to a normal reference succeeds, and every reference to an Optional succeeds unless it's unset and you failed to check for that. That is a huge win in maintainability.
Unfortunately, most languages that now offer Optional haven't abolished null, so you can only profit from the concept by instituting a strict policy of "absolutely no null, ever". Therefore, Optional in e.g. Java is not as compelling as it should ideally be.
An Optional brings stronger typing into operations that may fail, as the other answers have covered, but that is far from the most interesting or valuable thing Optionals bring to the table. Much more useful is the ability to delay or avoid checking for failure, and to easily compose many operations that may fail.
Consider if you had your optional variable from your example code, then you had to perform two additional steps that each might potentially fail. If any step along the way fails, you want to return a default value instead. Using Optionals correctly, you end up with something like this:
return optional.flatMap(x -> x.anotherOptionalStep())
.flatMap(x -> x.yetAnotherOptionalStep())
.orElse(defaultValue);
With null I would have had to check three times for null before proceeding, which adds a lot of complexity and maintenance headaches to the code. Optionals have that check built in to the flatMap and orElse functions.
Note I didn't call isPresent once, which you should think of as a code smell when using Optionals. That doesn't necessarily mean you should never use isPresent, just that you should heavily scrutinize any code that does, to see if there is a better way. Otherwise, you're right, you're only getting a marginal type safety benefit over using null.
Also note that I'm not as worried about encapsulating this all into one function, in order to protect other parts of my code from null pointers from intermediate results. If it makes more sense to have my .orElse(defaultValue) in another function for example, I have much fewer qualms about putting it there, and it's much easier to compose the operations between different functions as needed.
An Optional always contains a non-null value or is empty, yes, but you don't have an Optional, you have a reference of type Optional pointing to null. You need to initialize testString, e.g. to Optional.empty().
Optional isn't magic, it's an object like any other, and the Optional reference itself can be null. It's the contents of the Optional that can't be null.
From the oracle documentation for the Optional type :
A container object which may or may not contain a non-null value.
So, yes it will return null if the variable is set to null. More info here
In practice, why is this useful?
For example let's say you have this stream of integers and you're doing a filtering:
int x = IntStream.of(1, -3, 5)
.filter(x -> x % 2 == 0)
.findFirst(); //hypothetical assuming that there's no Optional in the API
You don't know in advance that the filter operation will remove all the values in the Stream.
Assume that there would be no Optional in the API. In this case, what should findFirst return?
The only possible way would be to throw an exception such as NoSuchElementException, which is IMO rather annoying, as I don't think it should stop the execution of your program (or you'd have to catch the exception, not very convenient either) and the filtering criteria could be more complex than that.
With the use of Optional, it's up to the caller to check whether the Optional is empty or not (i.e if your computation resulted in a value or not).
With reference type, you could also return null (but null could be a possible value in the case you filter only null values; so we're back to the exception case).
Concerning non-stream usages, in addition to prevent NPE, I think it also helps to design a more explicit API saying that the value may be present or not. For example consider this class:
class Car {
RadioCar radioCar; //may be null or not
public Optional<RadioCar> getRadioCar() {
return Optional.ofNullable(radioCar);
}
}
Here you are clearly saying to the caller that the radio in the car is optional, it might be or not there.
When Java was first designed it was common practice to use a special value, usually called null to indicate special circumstances like I couldn't find what you were looking for. This practice was adopted by Java.
Since then it has been suggested that this practice should be considered an anti-pattern, especially for objects, because it means that you have to litter your code with null checks to achieve reliability and stability. It is also a pain when you want to put null into a collection for example.
The modern attitude is to use a special object that may or may not hold a value. This way you can safely create one and just not fill it with anything. Here you are seeing Java 8 encouraging this best-practice by providing an Optional object.