【发布时间】:2010-08-03 23:16:31
【问题描述】:
为什么允许以下行为:
public class Foo {
public Foo() { ... }
public void Foo() { ... }
}
是否有正当理由将方法命名为与类相同?
【问题讨论】:
为什么允许以下行为:
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类的关系Son方法如果Son 类是许多其他项目的依赖项,那么#1 和#2 可能是不可接受的,让您别无选择,只能添加Son( ) 方法。
这是一个非常人为的例子。你不应该在真实的代码中看到这样的东西。
【讨论】:
构造函数与类同名,属于 Type 命名空间。方法命名空间不同于 Java 中的类型命名空间。所以这在技术上是允许的(这不是超载)。
但是,实际上没有任何正当理由将方法命名为与类名相同。这将被视为一种非常糟糕的做法。
【讨论】:
这太可恶了。我不允许这样的事情在代码审查中幸存下来。
【讨论】:
我看不出有什么正当理由。
C# 提供编译器错误 - “成员名称不能与其封闭类型相同”
这可能会让人很困惑,尤其是在使用反射来查看对象的组成时。
【讨论】:
方法的返回值被定义为void,而构造函数没有返回值,这使得它们不同,因此是有效的代码。然而,为什么有人会想要这样做,我无法理解。
【讨论】:
原因是在构造函数中,我们在创建类的对象时传递值。这就是为什么构造函数的名称应该相同,以便它可以获取传递的值并在创建时初始化类的对象创建。
【讨论】: