【问题标题】:Why not default constructors in Java 8?为什么不使用 Java 8 中的默认构造函数?
【发布时间】:2016-06-30 05:14:58
【问题描述】:

我阅读了this 的问题。答案是即使在 Java 8 中(我们可以在接口中拥有默认方法),我们也不能拥有 默认构造函数。它说这没有意义。

有人可以解释为什么它没有任何意义,或者是什么原因不支持 Java 8 中的默认构造函数?

【问题讨论】:

  • 为什么要能够实例化一个接口?
  • 构造函数通常设置接口没有的成员变量。那么这个默认构造函数通常会做什么呢?此外,一个类可以实现多个接口 - 那么您的类将继承哪个默认构造函数?
  • 即使不是那个接口,它也可以被具体的子对象继承,就像抽象类的构造函数一样。
  • 抽象类可以有状态,接口没有——默认方法只定义一种算法,但不能存储除局部​​变量以外的任何状态——构造函数是确保状态的强制性入口点对接口无用的对象(“无状态”)。
  • 试着用接口构造函数解释你想解决什么样的问题。然后我们可以告诉你构造函数不能解决你的问题。

标签: java interface java-8 default-constructor default-method


【解决方案1】:

构造函数的主要目的是提供已定义类型的实例,这在接口上没有意义,因为接口的主要目的是在代码中的组件之间提供契约。

至于默认构造函数,真的没有意义,既然默认方法是有逻辑的,那么你会在默认构造函数上声明什么样的逻辑呢?

【讨论】:

  • 另外,默认方法可以解决特定问题。默认构造函数可能只会导致问题,如果它们甚至可以被实现并使用 java 类型系统的规则
  • @SlipperySeal,默认方法解决的具体问题是什么?
  • @SupunWijerathne 来自文档:“默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。”
  • @SlipperySeal thnx。 :) 但实际上我没有得到这些话。无论如何,我会寻找更简单的解释。
  • 默认构造函数可以调用接口的方法,本质上是在构造实现它的类时强制调用初始化方法。我不知道它是否有用。
【解决方案2】:

构造函数是什么?只有类有构造函数,它们创建实例。

如果一个接口的方法都有默认实现,你可以像这样创建一个实例:

MyFace obj = new MyFace(){};

您似乎在感叹不得不编码两个额外的字符{}

【讨论】:

  • 我不确定这是否真的在创建界面的“实例”。您真正创建了一个内联实现。
  • 拥有接口默认构造函数可以避免像 MyFace obj = new MyFace(){}; 这样的假设代码obj.init();',所以不仅仅是'{}',特别是如果调用 init 是强制执行的。
  • @hyde:这是一个荒谬的场景,因为init() 没有任何用处。通过new MyFace(){} 创建的对象不包含init() 方法可以修改的任何状态。
猜你喜欢
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多