[
https://issues.jboss.org/browse/CDI-565?page=com.atlassian.jira.plugin.sy...
]
Martin Andersson commented on CDI-565:
--------------------------------------
I'm not sure I fully understood you on that "dropping behavior"-thing. NPE:s
is kind of what I try to advertise here =)
{{null}} is and will always be a valid candidate to represent the absence, or lack of, a
value. *YES*, we all agree that it is easy to misuse {{null}} and {{null}} should be
avoided if we so can. My point is definitely not that {{null}} is a god sent gift. Please
reread my comments and see if you can answer the questions I asked, for example, what is
the difference between {{Map}} and the CDI container (when it comes to dependency lookup)?
Also compare {{EntityManager.find()}} from the JPA specification which I believe is
another comparable interface.
Everything is an API. I don't understand this notion really or how it relates to the
topic of discussion. I googled the CDI specification, {{null}} return values are used
everywhere. Would you like to advocate that we setup tens of new exception types into our
type system instead?
Speaking of API:s, I would appreciate an {{Optional}} return type from a service only if
it is conceivable and often enough the case that no return value is present. For example:
{{tryCatchAFish()}}, {{getLotteryWinner()}}. Or, if it is conceivably so that the client
doesn't bother about the presence of the value, he's sole intent is to pass it
around somewhere. For example:
{{myDataSource.getSomeData().ifPresent(someValueContainer::setThatField)}}. I myself
overused {{Optional}} once it was out in JDK 8, singing praise to Jesus every minute of
the day. Only to discover that my overuse of it introduced complex boilerplate code.
Eventually I got so lazy that I dereferenced those optionals anyway
({{Optional.get().doSomething()}} and so it was only a matter of time before I found
myself back in square one. But this time, not only did I have NPE:s, all my clients had to
make an extra method call all over the place for no apparent gain. More than anything
else, I learnt by my own mistake that if a parameter is optional for the client, then
accept {{null}}. Don't force the clients to type {{Optional.empty()}} instead of the
oh so simple blueish keyword {{null}}. Null as parameters make the life easier for the
implementations too.
Also, if you know a "modern language" that had any success avoiding {{null}},
please let me know. That would be interesting. For example, how would I create a new 10
element array? Am I required to have all ten elements right of the bat?
Guys, what is the most intuitive thing to do here? Why do you believe that the dependency
lookup should have different semantics than {{Map.get()}}?
Unsatisfied dependency should be null?
--------------------------------------
Key: CDI-565
URL:
https://issues.jboss.org/browse/CDI-565
Project: CDI Specification Issues
Issue Type: Feature Request
Components: Beans
Reporter: Martin Andersson
What if I am writing a component that call a collaborator only if that class exist during
runtime? It is amazingly intuitive to write code like this:
{code:java}
class MyComponent
{
@Inject
SomeCollaborator collaborator;
public void someMethod() {
// .. do something
if (collaborator != null) {
collaborator.callback();
}
}
}
{code}
But the specification currently says in section "5.2.2. Unsatisfied and ambiguous
dependencies" that this code should cause a "deployment problem". IIRC,
GlassFish 4.1 and WildFly 9 doesn't actually crash during deployment. They will inject
{{null}}. WebLogic 12, I just learned, do crash during deployment.
I believe it is unfortunate to have this null value logic for no apparent reason. It is
inevitably so that the application code would crash anyways as soon as it tries to
dereference a null reference. And you probably agree with me that there's a general
guideline established in the developer community which say you shouldn't do null
pointer checks all over the code because null pointers will crash exactly when and where
the absence of a value really is a problem.
The work around is to inject an {{Instance}} of my type and iterate through all of them,
or do any other form of programmatic lookup. However, me personally, I've had this
requirement far too many times now. It is often the case that a component I write has a
"subframework" in place such that when I want to affect how the application
performs, I can just add in new classes of a particular type and it is scoped up. Please
don't even make the notion of a design smell out of your own lack of creativity, if
you want to see a concrete example then of course I am more than happy to provide you with
that. Just saying =)
Something so intuitive and present in our every day coding life as a "null return
value" should be present in the CDI specification too. I mean that is what the
specification in essence is; one huge {{lookupInstanceOf(class)}}-method. Reading this
method name, would you really expect it to crash, or return {{null}}?
How about adding in a new annotation such that the injection point accept null values for
unsatisfied dependencies, but if the injection point has an annotation {{@Required}}, then
an unsatisfied dependency do crash for this injection point?
You will probably say "let's do it the other way around so that we don't
brake backward compatibility" by creating an {{@Optional}} annotation. Hey, if I am
abusive to my wife and she divorce me. Should I continue to be abusive to my next wife so
that I don't break backward compatibility? Our number one goal should be to define the
most awesome specification and API possible - nothing else. If we keep leaving small piles
of poo everywhere, then we will inevitably end up deep in shit.
Thank you all for your hard work and time devoted to making all of our lives so much
greater.
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)