[lambda-leftovers] Underscore parameter for abstract/native methods
Brian Goetz
brian.goetz at oracle.com
Fri Jun 30 21:38:13 UTC 2017
So, a fair question is whether _ should be supported for methods at all,
because (in many cases) method parameters are both declaration and
implementation. This feature started out for lambdas (whose parameters
are pure implementation), and then got extended to catch formals (also
pure implementation) and method parameters (not pure implementation.)
And once we bring in methods, it raises tooling questions like "what
about Javadoc." So maybe the last step was the problem.
Here's a menu of defensible options here:
A. Don't allow _ for method or constructor parameters.
B. Only allow _ for method parameters in *anonymous* classes. This has
the advantage that it makes it easier to freely refactor lambdas to/from
anon classes.
C. The option I proposed the other day -- only allow _ as a method
parameter name for concrete class methods that are known to be an
@Override of some other method. This excludes all interface and
abstract methods, constructors, and "initial declarations" of methods in
base classes.
D. Allow it in all methods.
Now that this has been pointed out, I'm pretty down on D. C is
defensible, but likely will feel arbitrary. B does has a nice symmetry
to it, but it means it drags tooling support (Javadoc) into the
feature. And A avoids the problem entirely. (Though, like with LVTI,
people will inevitably ask "but what about private methods? And they'd
get the same answer, regarding source compatibility of modifier changes.)
Leaning towards A....
On 6/25/2017 6:51 AM, Tagir Valeev wrote:
> Hello!
>
> Currently in lambda-leftovers underscore is allowed as a parameter name for
> abstract methods. This looks dubious as normally underscore means that
> parameter is not used in the corresponding method/lambda/catch body, but
> there's no actual body and no parameter is actually used anyways (but could
> be used in abstract method implementations). I think, allowing underscores
> for interface methods may encorage bad practices of defining interfaces
> without readable parameter names:
>
> interface X {
> void doSomething(int _, long _, String _);
> }
>
> Should not this be disabled?
>
> It's even worse for native methods, because underscore assumes that
> parameter is not used, but it does not limit the corresponding native
> implementation from using it.
>
> With best regards,
> Tagir Valeev.
More information about the amber-dev
mailing list