我正在阅读有效的Java教科书。第一项是关于使用静态工厂方法而不是公共构造函数。我的疑问是,如果我要指定Interface
如何在中指定静态工厂方法Interface
?因为java里面不支持静态方法interface
。教科书详细说明了如何创建一个包含公共静态工厂方法的不可实例化的类。但是这些方法如何访问实现类的私有构造函数?
教科书说如果您要定义Interface Type
,请创建一个非实例化的类Types
,并将静态工厂方法包括在该类中。但是Types
类中定义的方法如何访问具体实现的私有构造函数Interface Type
编辑:-下面的句子引用了课本。请解释一下我的意思
“接口不能具有静态方法,因此按照惯例,将名为Type的接口的静态工厂方法放入名为Types的不可实例化的类(第4项)中”
编辑:-摘自Joshua Bloch的Effective Java:Item1-静态工厂方法
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
您可以将工厂定义为返回Interface,但在内部它会创建一个具体类。
例如:
public Interface I { }
private class Impl implements I {
}
I buildI() {
return new Impl();
}
诀窍是使用包私有(或即使它们是内部类私有)构造函数创建实现,然后只有工厂才能构建它们。
这种方法的强大之处在于,工厂可以根据需求构建适当的实施方案,并且一切对用户都是无形的。例如,当你创建一个EnumSet
工厂使用有多个内部实现取决于有多少项有在Enum
该EnumSet
正在修建的。一个超快速版本,长期Enums
使用少于64个条目的位域,而较慢版本则用于较长的枚举。
要指定工厂的接口,您需要做的是:
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();
}
}
但是现在您可以将同一工厂类用于绝对需要工厂的任何东西,只需更改泛型要求即可。
它可以调用私有构造函数的原因非常简单-在同一类中声明!
在一个Java文件中,您可以使用私有构造函数创建类。然后,您可以在类内部定义静态方法,即使该方法是静态的,它仍然具有访问构造函数所需的特权。
如果工厂和实现位于单独的类中,则将它们放置在同一包中,并且该方法将包设为私有而不是私有。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句