为什么我们需要在接口中指定参数名称?

23

当我们创建接口方法时,是否不能像 Java 中那样做:

void interface_method(Integer,String, /* other parameter */);

我注意到我们还需要像这样给出参数名称:

void interface_method(Integer i, String s);
此外,接口的实现者不需要与接口方法中的参数名称相同。
我在stackoverflow上找到了一个关于c#的类似问题,链接在这里。他们提到了一种命名参数的情况,但我没有发现在Java中还有其他相关原因。

1
+1:非常有趣的问题。C和C++没有这个要求...真的不知道为什么Java会有。 - Heisenbug
你会得到很多可能原因的建议,但这都是猜测。你问错地方了。你需要问Jim Gosling。 - user207421
3个回答

28
从技术角度来看,这并不是必需的。
我一直认为它是语法规范化和文档辅助。
这样就可以做到:
  1. 没有理由区分类和接口方法的语法,
  2. 可以使用(描述性的!)参数名称生成默认的Javadoc文档。

1
你提到的Javadoc的观点可以更加强调:如果参数名称是可选的,那么所有的@param标签都需要按正确顺序排列,而缺少参数会导致更多的混乱。 - Sergey Kalinichenko

15

没有参数名称,很难区分相同类型的参数。

double divide(double, double);

通常情况下,第二个参数被认为是除数。但使用命名参数时,它变得明确而且更清晰。因此,文档可以清楚地使用名称而不必在尝试解释方法应该如何使用以及每个参数代表什么时不断说“第一个参数”或“第二个参数”。


如果正确区分参数是很重要的,那么还不如通过Javadoc而不是参数名称更好? - Priyank Doshi
5
我认为不是这样;文档的首要来源应该始终是代码,因为代码是最终的产物。Javadoc用于提供在签名中不可用的附加信息。 - Dave Newton
@PriyankDoshi:另外,并没有要求javadoc必须按照方法签名的顺序列出参数。可以有理由首先列出最重要的参数。此外,如果您向方法添加一个参数并将其放在开头,则所有旧文档都将无效,因为“第一个参数”不再指代相同的内容。对于名称而言,即使它成为第二个参数,thing1的意图仍然保持不变。 - unholysampler
好的。我会说这听起来像是真正的答案。 - Arturas M

5

我的看法:

  1. 语言规范要求参数有名称;

  2. 接口本身就是接口,名称有助于传达含义;

  3. 接口不是像C/C++中将要跟随的实现的前向声明,因此比较并不完全正确;


  1. 如果是语言规范,他们总是可以为接口方法做出例外!
  2. Javadoc 不是更好的选择吗?
- Priyank Doshi
1
@PriyankDoshi也许他们会,但我怀疑。使用参数名称强制进行通信,使用javadoc是可选的。 - maksimov
是的,这可能是情况。程序员总是讨厌文档.. :P 参数名称可能有用。 - Priyank Doshi
1
有些极客并不会因此而受到阻碍,他们仍然可以将他们的参数称为p1、p2、p3等。 - maksimov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接