gpt4 book ai didi

Java 处理大量具体工厂

转载 作者:行者123 更新时间:2023-12-01 21:27:13 24 4
gpt4 key购买 nike

我想为许多(~40-50)个相似的实体概括一段重复的 Java 代码(在我的例子中,这一段是使用这些实体对文件进行索引)。

我尝试用泛型方法重构它,但是,结果,我得到了一个泛型类的构造函数,这在 Java 中显然是被禁止的。为了避免这种情况,我实现了抽象工厂模式,这就是我得到的。

public <E extends CMObject, F extends IndexedFile<E>> F indexFile(CMFactory<E, F> factory) {
F items;
ByteBuffer[] buffs;

// ...filling buffers...

items = factory.makeFile(buffs); // as I cannot do items = new F(buffs)

return items;
}

public CityFile getCities() {
return indexFile(new CityFactory());
}

public ContinentFile getContinents() {
return indexFile(new ContinentFactory());
}
// a lot of more

这解决了创建泛型类实例的问题。然而,我现在面临着为每个实体创建一个具体工厂的任务,这似乎是一项很单调的工作,因为它们看起来都很相似。

public abstract class CMFactory<E extends CMObject, F extends IndexedFile<E>> {
public abstract F makeFile(ByteBuffer[] buff);
}

public class CityFactory extends CMFactory<City, CityFile> {
@Override
public CityFile makeFile(ByteBuffer[] buff) {
return new CityFile(buff);
}
}
public class ContinentFactory extends CMFactory<Continent, ContinentFile> {
@Override
public ContinentFile makeFile(ByteBuffer[] buffs) {
return new ContinentFile(buffs);
}
}

问题是:有什么方法可以自动创建这样的工厂吗?或者也许有另一种模式至少可以让这种创造不那么痛苦?

我尝试使用 IntelliJ IDEA 的 Replace Constructor with Factory Method 重构,但这对我没有帮助。

最佳答案

由于您的 CMFactory 几乎是一个函数式接口(interface),因此您可以使用构造函数句柄,而不是为每个具体类实现 CMFactory:

使CMFactory成为一个接口(interface):

public interface CMFactory<E extends CMObject, F extends IndexedFile<E>> {
public abstract F makeFile(ByteBuffer[] buff);
}

然后写

public CityFile getCities() {
return indexFile(CityFile::new);
}

您甚至可以放弃CMFactory并使用java.util.Function:

public <E extends CMObject, F extends IndexedFile<E>> F indexFile(Function<ByteBuffer[],F> factory) {
ByteBuffer[] buffs;
// ...filling buffers...
return factory.apply(buffs);
}

关于Java 处理大量具体工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37943943/

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