gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:18:37 27 4
gpt4 key购买 nike

我正在阅读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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com