java - 接口(interface)类java中的静态工厂方法

标签 java static-factory

我正在阅读Effective java教科书。第一项是关于使用静态工厂方法而不是公共(public)构造函数。我的疑问是,如果我指定一个 Interface 我如何在 Interface 中指定一个静态工厂方法?因为java不支持interface内部的静态方法。教科书详细说明了如何创建包含公共(public)静态工厂方法的非实例化类。但是那些方法如何访问实现类的私有(private)构造函数呢?

教科书说,如果您要定义一个Interface Type,请创建一个不可实例化的类Types,并在该类中包含静态工厂方法。但是 Types 类中定义的方法如何访问 Interface Type

具体实现的私有(private)构造函数

编辑:- 以下句子引自教科书。请解释一下它的含义

“接口(interface)不能有静态方法,所以按照惯例,名为Type 的接口(interface)的静态工厂方法放在名为Types 的不可实例化类(第 4 项)中"

编辑:- 摘自 Effective Java By Joshua Bloch: Item1 - Static Factory Method

     public interface Foo{ //interface without plural 's' (question 1)
     public void bar();
 }
 public abstract class Foos(){ // abstract factory with plural 's' (question 1)
    public static Foo createFoo(){
        return new MyFoo();
    }
    private class MyFoo implements Foo{ // a non visible implementation (question 2)
       public void bar(){}
    }
 }

我的问题是静态方法createFoo()如何调用MyFoo的私有(private)构造函数

最佳答案

您可以将工厂定义为返回接口(interface),但在内部它会创建一个具体类。

例如:

public Interface I { }

private class Impl implements I {
}

I buildI() {
    return new Impl();
}

诀窍是使用包私有(private)(或者即使它们是内部类私有(private))构造函数创建实现,然后只有工厂可以构建它们。

这种方法的强大之处在于,工厂可以根据需求构建适当的实现,并且所有这些对用户来说都是不可见的。例如,当您使用工厂创建 EnumSet 时,有多个内部实现,具体取决于 Enum 中有多少条目 EnumSet 是正在 build 。对于少于 64 个条目的 Enums,在 long 上使用位域的超快版本,对于较长的枚举,速度较慢的版本。

要为工厂指定接口(interface),您需要做的就是:

public interface Factory {
   I buildI();
}

现在人们可以用 setFactory(new FactoryImpl()); 调用你,然后你可以调用 factory.buildI() 然后他们的代码返回具体实现。

您可以更进一步并使用泛型:

public interface GenericFactory<T> {
    T buildInstance();
}

然后你的 setFactory 变成:

public void setFactory(GenericFactory<I> factory);

要创建工厂,他们会这样做:

public class FactoryImpl implements GenericFactory<I> {
     @override
     I buildInstance() {
        return new impl();
     }
}

但现在您可以将同一个工厂类用于任何需要工厂的东西,只需更改泛型要求即可。

它可以调用私有(private)构造函数的原因很简单——在同一个类中声明!

在一个 Java 文件中,您可以使用私有(private)构造函数创建类。然后在类中定义静态方法,即使它是静态的,它仍然具有访问构造函数所需的权限。

如果工厂和实现在不同的类中,那么它们将被放在同一个包中,并且该方法使包成为私有(private)的而不是私有(private)的。

关于java - 接口(interface)类java中的静态工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20563796/

相关文章:

java - JPA, hibernate : OneToOne mapping with foreign key only

java - 功能接口(interface)

c# - 静态工厂方法与公共(public)构造函数

design-patterns - 工厂模式 - CreateInstance 是否静态?

java - 不持久化一个对象

java - 如何在动画之前和之后执行 Action

java - 我可以使用父类(super class)的类工厂静态方法创建子类实例吗?

java - 静态工厂 builder 的麻烦

java - GSS-API MSSQL JDBC 驱动程序