【问题标题】:Methods With Same Name as Constructor - Why?与构造函数同名的方法 - 为什么?
【发布时间】:2010-08-03 23:16:31
【问题描述】:

为什么允许以下行为:

public class Foo {
  public Foo() { ... }
  public void Foo() { ... }
}

是否有正当理由将方法命名为与类相同?

【问题讨论】:

    标签: java oop


    【解决方案1】:

    我的猜测是它是允许的,因为明确禁止它会给 Java 的标识符命名规则增加另一个要求,而收益却很小。与 C++ 不同,Java 总是要求使用 new 关键字调用构造函数,因此对于标识符是指方法还是构造函数从来没有任何歧义。我确实同意与父类同名的方法乍一看会让人很困惑,几乎可以肯定地避免使用它。也就是说,我很高兴他们选择不通过禁止此类方法使语言进一步复杂化。

    【讨论】:

      【解决方案2】:

      我能想到的唯一有效原因是,如果父类在您编写子类之后添加方法:

      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。你可以

      1. 更改Son 类的名称
      2. 打破与Father类的关系
      3. 添加Son方法

      如果Son 类是许多其他项目的依赖项,那么#1 和#2 可能是不可接受的,让您别无选择,只能添加Son( ) 方法。

      这是一个非常人为的例子。你不应该在真实的代码中看到这样的东西。

      【讨论】:

        【解决方案3】:

        构造函数与类同名,属于 Type 命名空间。方法命名空间不同于 Java 中的类型命名空间。所以这在技术上是允许的(这不是超载)。

        但是,实际上没有任何正当理由将方法命名为与类名相同。这将被视为一种非常糟糕的做法。

        【讨论】:

          【解决方案4】:

          这太可恶了。我不允许这样的事情在代码审查中幸存下来。

          【讨论】:

            【解决方案5】:

            我看不出有什么正当理由。

            C# 提供编译器错误 - “成员名称不能与其封闭类型相同”

            这可能会让人很困惑,尤其是在使用反射来查看对象的组成时。

            【讨论】:

              【解决方案6】:

              方法的返回值被定义为void,而构造函数没有返回值,这使得它们不同,因此是有效的代码。然而,为什么有人会想要这样做,我无法理解。

              【讨论】:

                【解决方案7】:

                原因是在构造函数中,我们在创建类的对象时传递值。这就是为什么构造函数的名称应该相同,以便它可以获取传递的值并在创建时初始化类的对象创建。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-12-18
                  • 2018-02-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多