【问题标题】:Java constructor reference assignment Vs new created object assignmentJava 构造函数引用赋值与新创建的对象赋值
【发布时间】:2015-08-18 21:41:09
【问题描述】:

我在我们的项目中遇到了以下代码:

MyInterface var = MyClass::new;

有什么区别

MyInterface var = new MyClass();

懒惰?

【问题讨论】:

  • 他们没有任何共同点。

标签: java constructor java-8 variable-assignment method-reference


【解决方案1】:
MyInterface var = new MyClass();

创建MyClass 的实例并将其分配给MyInterface 类型的变量。这需要 MyClass implements MyInterface 并具有无参数构造函数。结果是MyClass 的一个实例,它实现了MyInterface,但是它喜欢。


MyInterface var = MyClass::new;

尝试实现MyInterface ad-hoc。这要求MyInterface 是一个具有单一抽象方法的功能接口。该单一抽象方法必须具有可从MyClass 分配的返回类型和匹配MyClass 构造函数之一的参数列表。

类似于:

MyInterface var = new MyInterface() {
    public MyClass anyMethodName() {
        return new MyClass();
    }
}

结果是MyInterface 的一个实例,它将在调用其单个抽象方法时创建一个新的MyClass 实例,将其所有参数传递给MyClass 的构造函数。


换句话说,这两个结构没有任何共同点。

【讨论】:

  • 看起来你错了这两个构造没有共同点唯一的区别是我不能将第二个构造结果转换为 MyClass
  • 第二个构造不需要MyClass 实现MyInterfaceMyInterfaceMyClass 之间有任何关系。它与Supplier<MyClass> s=MyClass::new; 没有什么不同。如前所述,if MyClass 实现 MyInterface 它可以按照自己的意愿进行操作,并且通过让 MyClass 构造其他 MyClass 实例来实现它是非常罕见的。关键是,仅仅因为您可以使用这两个语句之外的几种特殊安排使其等价,并不会使这两个结构本身等价。
  • 第二个构造如:new MyInterface{ public MyClass{return new Myclass()}}
  • 那不是有效的 Java 代码。但无论如何,这是一个毫无意义的讨论。 创建 X 的工厂与 X 的实例 完全不同。这是根本的区别,即使您可以使 X 实现与 X 的工厂相同的接口,也不会消除这种区别,就像 foo()bar() 是不同的方法一样虽然你可以让他们做同样的事情,但他们仍然不同。
  • 那又怎样? MyInterface var = new MyInterface(){ public MyClass anyMethodName(){ return new MyClass(); } } 也不等同于MyInterface var = new MyClass();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2019-11-02
  • 1970-01-01
  • 2020-03-22
  • 2016-09-13
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多