【问题标题】:Why cannot we have constructor with name different from class names as long as they are unique为什么我们不能有名称与类名不同的构造函数,只要它们是唯一的
【发布时间】:2019-05-22 15:57:07
【问题描述】:

我了解 Java 施加了一个限制,即类名应与构造函数名相同。为什么要施加这种限制?为什么我不能有一个与类名不同的类的构造函数,只要不存在任何其他类的同名构造函数?

【问题讨论】:

  • 您如何建议将方法指定为构造函数?
  • 因为使用与类相同的名称正是我们表明声明是构造函数的方式。此外,它会引起混乱,这会破坏 Java 的代码尽可能可读的使命。你总是可以写静态工厂方法,比如NumberFormat.getInstance
  • 有人可能会争辩说,静态工厂方法命名构造函数的 Java 习惯用法。

标签: java oop object constructor


【解决方案1】:

假设我们可以有另一个名字而不是类名,你必须检查它是否已经被用于任何其他类。要详细说明,请考虑以下示例,

Person p1 = new Vehicle(); 

现在,在另一个班级

MotorCycle m1 = new Vehicle(); // if you have used the same name then it will create a conflict for the compiler which implementation should be considered. 

现在,考虑一下实际的构造函数命名约定,如果您使用与类名称相同的名称,它会更容易也更有意义。

Person p1 = new Person();
MotorCycle m1 = new MotorCycle();

【讨论】:

    【解决方案2】:

    这是因为 Java 无法“看到”其他类,它在编译时只关心一个类。

    此外,如果构造函数的名称不是类名,则无法找到它,并且无论如何也没有任何意义。想象一下这样做:

    Person person = new Robot();
    

    其中Robot 将是Person 中的构造函数。它对人类或编译器没有任何意义!

    【讨论】:

    • 将 Robot() 作为构造函数名称确实有意义,Python 构造函数是 init,它没有类名。
    • 这不是 python。 python也没有和java一样的设计理念。
    • 反正init在python中是标准的,就像java中的类名一样。
    • 只是为了澄清python参数:__init__不是python中的构造函数,__new__是,但约定与Java相同。 class Person: def __init__(self)等仍初始化为person = Person()
    【解决方案3】:

    此约定是为了便于编程、构造函数链接和语言的一致性。

    例如,考虑一个你想使用 Scanner 类的场景, 现在 如果 JAVA 开发人员将构造函数命名为 xyz 会怎样!

    那你怎么知道你需要写:

    扫描仪 scObj = new xyz(System.in) ;

    这可能真的很奇怪,对吧! 或者,您可能不得不参考一个巨大的手册来检查每个类的构造函数名称以便创建对象,如果您可以通过命名与类的构造函数相同的构造函数来解决问题,那么这又是没有意义的。

    其次,构造函数本身是由编译器创建的,如果您没有明确提供它,那么编译器可以自动选择构造函数的最佳名称,因此程序员很清楚!显然,最好的选择是保持与类相同。

    第三,你可能听说过构造函数链接,那么在构造函数之间链接调用时,编译器将如何知道你给被链接的类的构造函数起什么名字! 显然,问题的解决方案还是一样的,保持构造函数的名称与类的名称相同。

    感谢提问。

    【讨论】:

      【解决方案4】:

      我猜想为类和它的构造器具有相同名称的约定被认为是有用的。或者,必须使用关键字(constructor?)扩展语言,解决方法名称冲突等...

      您能分享一个受益于任意命名构造方法的用例吗?

      【讨论】:

      • 我没有看到任何好处,但确实为程序员提供了灵活性。即使与类名不同,构造函数名也不需要关键字;因为构造函数不返回任何东西(甚至不返回 void):在运行时,它可以被识别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2019-05-23
      • 2013-12-10
      • 2023-04-09
      • 2011-02-04
      • 2010-11-25
      相关资源
      最近更新 更多