jspecify: [moved to #230] Decide whether to include a `@NonNull` annotation
[edit: closed for being too long and disorganized. See #230.]
[TODO: direct link to doc about this issue]
The question was initially asked by @cpovirk
To be honest, I didn’t get the question
About this issue
- Original URL
- State: closed
- Created 6 years ago
- Comments: 60 (2 by maintainers)
@cpovirk maybe it’s unfair to put the burden of proof in this direction, but I (still) don’t have any intuition for how this annotation can introduce problems? I can follow the arguments for how it could be (made) largely unnecessary, but I am frankly lost as to how it could be bad to have it. Is this just about minimizing what we provide, or are there other risks here? How do those risks compare to the problems with the other options you mention as alternatives?
I can buy that per-method defaults can reduce the need for
@NonNull, but per-method defaults arguably have their own downsides in terms of clarity (with and without type parameters in the mix). Further, and this is somewhat problematic / speculative to bring up, it seems plausible someone might want to just use type-use annotations in method bodies or on a field, to aid in their coding–with or without annotating method parameters/returns–and even though we don’t want to prescribe what tools should do with that, I also don’t think we’d want people to use a different set of nullness annotations in method bodies just because we’re missing one they’d like. Which also highlights another issue, which is that if we leave it out we seemingly run the risk that people try to compensate with, say,@javax.annotations.Nonnullif they feel they need it.More philosophically, I think I’m struggling to even imagine a world without
@NonNullat least in part b/c I think of@NonNulland@Nullableas the two annotations that fundamentally define the semantics, by refining the base types they’re applied to, and@DefaultNonNullas an optional shortcut/convenience. Case in point, the way I’ve tried to define@DefaultNonNullis in terms of “imagining” that@NonNullwas placed in various places in its scope. Pulling@NonNulldoesn’t strictly prevent that, since we can still “imagine” that it’s there, or make some other construct, but it is exceedingly odd to me to not be able to directly “address” or “say” the thing that@DefaultNonNullindirectly gets at.The most recent comment sounds like the need for an annotation like
@NonNull, even if isn’t called that, is accepted, so I propose we close this. We have issue #91 to discuss@NonNullspecifically on type variables, which I believe has been the only potentially questionable use of@NonNullidentified here, and since that issue motivates the different name mentioned, we can discuss it there as well.At danger of missing something, but for my future self’s benefit, I’ll add that it seems inescapable that we need an annotation to express non-nullness of a particular type usage (whatever that annotation is called), at a minimum, for two use cases I’m aware of:
@DefaultNonNullto the entire surrounding class, which not only seems heavy-handed, but also puts substantial burden to review entire files on first-time users that may only be interested in a single method (or smaller).I believe the first use case in particular deserves attention as it seems to affect ease of adoption: absence of
@NonNulleffectively appears to be an entry barrier to using nullness annotations.(This makes me think we might get mileage from more systematically writing up use cases somewhere: doing so may help us answer other questions as well, e.g., issue #89.)
For risk of sounding like a broken record, but I cannot fancy how we could ever explain non-null types to users without
@Nonnull. Not sure if I mentioned already: In Eclipse text hovers over a method affected by@NonNullByDefaultwill expand all signatures by inserting@NonNullwhereever this is the effective annotation. The same for inferred types. If we don’t have that annotation, we cannot communicate this fact to the user – bummer.