【问题标题】:What does "Static factories returned object need not exist" mean?“静态工厂返回的对象不需要存在”是什么意思?
【发布时间】:2019-04-13 21:40:00
【问题描述】:

在阅读“Effective Java”时,J.Bloch 偶然发现了这句话

静态工厂的第五个优点是在编写包含该方法的类时,返回对象的类不需要存在。

这是什么意思?有人可以用一些例子来解释吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    这意味着你的静态工厂方法的API可以返回一个接口类型,它的实现要等到以后再编写或生成。

    举个例子:

    public static MyInterface getMyInterfaceInstance() {
        //load instance dynamically and return it.
    }
    

    在这种情况下,工厂方法只需要在编译时存在MyInterface 接口即可。实际实现可以在运行时以多种方式动态加载,包括:

    • 创建代理对象
    • 反射(运行时加载的可配置实现类名)
    • 查找service loader

    特别是,最后两个选项仅仅意味着实现类可以写在不同的模块中(并且许多模块可以提供接口的实现),并且这些实现类将在运行时被发现 - 这使得它成为可能在实际实现类之前编写静态工厂方法。

    【讨论】:

    • 一个问题,难道不应该至少有一个该接口的实现吗?我的意思是必须从具有该返回类型的方法返回一些东西,不是吗?而且由于MyInterface 没有实现,它会导致错误,除非返回null。我真的无法理解它。
    • @MensurQulami 重点不在于没有实现。这是关于将实现与工厂分离。带有getMyInterfaceInstance() 的代码可以在实现MyInterface 的代码之前几周发布。如果这个方法的实现是,例如return (MyInterface) Class.forName(System.getProperty("my.interface.implementation.class")).newInstance(),那么实现MyInterface的类不需要和这个静态工厂同时编译。当然需要一个实现类(但仅在运行时)
    • 非常感谢您的详细解释。
    猜你喜欢
    • 2017-08-13
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2018-06-09
    • 2011-07-10
    • 2017-03-18
    相关资源
    最近更新 更多