与构造函数同名的方法 – 为什么?
为什么允许以下内容:
public class Foo { public Foo() { ... } public void Foo() { ... } }
是否有正当理由将方法命名为与类相同?
我的猜测是它是允许的,因为明确禁止它会增加Java的标识符命名规则的另一个要求,几乎没有什么好处。 与C ++不同,Java总是要求使用new
关键字调用构造函数,因此对于标识符是指方法还是构造函数,从不存在任何歧义。 我确实同意一个与其父类同名的方法乍一看是相当混乱的,应该几乎可以避免。 也就是说,我很高兴他们选择不通过禁止这些方法来进一步使语言复杂化。
这太令人发指了。 我不会允许这样的事情在代码审查中存活下来。
唯一合理的理由 – 我能想到 – 利用它是因为父类在编写子类后添加了方法:
interface Father { } // version 1.0 class Son implements Father { Son ( ) { } } // version 1.0 interface Father { void Son ( ) ; /* new method */ } // version 2.0 class Son implements Father { Son ( ) { } void Son ( ) { } } // version 2.0
如果您无法控制Father
接口,但确实可以控制Son
类,那么您必须以某种方式更改Son
。 你可以
- 更改
Son
类的名称 - 打破与
Father
class的关系 - 添加
Son
方法
如果Son
类是许多其他项目的依赖项,则#1和#2可能是不可接受的,除了添加Son( )
方法之外别无选择。
这是一个非常人为的例子。 你永远不应该在真正的代码中看到这样的东西。
构造函数与类具有相同的名称,属于Type命名空间。 方法命名空间与Java中的类型命名空间不同。 所以这在技术上是允许的(这不是重载)。
但是,实际命名方法与类名相同没有任何正当理由。 这将被视为一种非常糟糕的做法。
我看不出它的正当理由。
C#提供编译器错误 – “成员名称不能与其封闭类型相同”
这可能非常令人困惑,尤其是在使用reflection来查看对象的组成时。
方法的返回值被定义为void,而构造函数没有返回值,这使它们不同,因而是有效的代码。 然而,为什么有人想要这样做是超出我的。
原因是在构造函数中,我们在创建类的对象时传递值。这就是为什么构造函数的名称应该相同,以便它可以接受传递的值并在创建对象时初始化class上。