我正在阅读Effective java教科书。第一项是关于使用静态工厂方法而不是公共(public)构造函数。我的疑问是,如果我指定一个 Interface
我如何在 Interface
中指定一个静态工厂方法?因为java不支持interface
内部的静态方法。教科书详细说明了如何创建包含公共(public)静态工厂方法的非实例化类。但是那些方法如何访问实现类的私有(private)构造函数呢?
教科书说,如果您要定义一个Interface Type
,请创建一个不可实例化的类Types
,并在该类中包含静态工厂方法。但是 Types
类中定义的方法如何访问 Interface Type
编辑:- 以下句子引自教科书。请解释一下它的含义
“接口(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/