接口类java中的静态工厂方法

马努·维斯瓦姆

我正在阅读有效的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

B队

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

例如:

public Interface I { }

private class Impl implements I {
}

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

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

这种方法的强大之处在于,工厂可以根据需求构建适当的实施方案,并且一切对用户都是无形的。例如,当你创建一个EnumSet工厂使用有多个内部实现取决于有多少项有在EnumEnumSet正在修建的。一个超快速版本,长期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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何混合静态类工厂方法和实例方法

来自分类Dev

将包含静态工厂方法的 Java 类转换为 Kotlin 时出现问题

来自分类Dev

静态工厂方法-单独的类将数据保存在列表中

来自分类Dev

我可以在抽象类中创建静态工厂方法吗?

来自分类Dev

如何使用静态工厂方法创建抽象类?

来自分类Dev

Java泛型和静态工厂方法-语法

来自分类Dev

Java帮助使用通用类阐明工厂方法

来自分类Dev

相关类层次结构中工厂方法的实现

来自分类Dev

静态工厂方法与公共构造函数

来自分类Dev

继承和静态工厂方法

来自分类Dev

工厂方法如何返回接口和抽象类的实例?

来自分类Dev

PHP静态工厂方法:动态实例化调用类的实例

来自分类Dev

具有静态工厂方法或构造函数的工厂模式

来自分类Dev

带有工厂方法和参数的Spring静态工厂

来自分类Dev

Ruby类,子类和工厂方法

来自分类Dev

UICololor类工厂方法-何时发布

来自分类Dev

工厂方法中的链式方法

来自分类Dev

Objective-C中的工厂方法

来自分类Dev

Ninject C#中的工厂方法

来自分类Dev

angularjs中工厂方法的空数组

来自分类Dev

Ninject C#中的工厂方法

来自分类Dev

angularjs中工厂方法的空数组

来自分类Dev

如何获取工厂方法的类属性的接口类型

来自分类Dev

找不到用于内省工厂方法的类文件:java.util.concurrent.ThreadPoolExecutor.DiscardPolicy

来自分类Dev

基类的工厂方法实例化派生类

来自分类Dev

Fragment的工厂方法:设置类变量与将Bundle作为参数放入Fragment中

来自分类Dev

如何从Swift调用Objective-C类的工厂方法?

来自分类Dev

包含工厂方法的抽象超类实现如何访问?

来自分类Dev

用前导点符号调用Swift类工厂方法?

Related 相关文章

热门标签

归档