gpt4 book ai didi

java - 在 Java 中创建不依赖 if-else 的工厂方法

转载 作者:IT老高 更新时间:2023-10-28 20:47:31 24 4
gpt4 key购买 nike

目前我有一个方法可以作为基于给定字符串的工厂。例如:

public Animal createAnimal(String action)
{
if (action.equals("Meow"))
{
return new Cat();
}
else if (action.equals("Woof"))
{
return new Dog();
}

...
etc.
}

我想要做的是在类列表增长时避免整个 if-else 问题。我想我需要有两种方法,一种将字符串注册到类,另一种根据操作的字符串返回类。

在 Java 中有什么好的方法可以做到这一点?

最佳答案

你所做的可能是最好的方法,直到可以打开字符串。 (2019 年编辑: 可以打开字符串 - 使用它。)

您可以创建工厂对象和从字符串到这些对象的映射。但这在当前的 Java 中确实有点冗长。

private interface AnimalFactory {
Animal create();
}
private static final Map<String,AnimalFactory> factoryMap =
Collections.unmodifiableMap(new HashMap<String,AnimalFactory>() {{
put("Meow", new AnimalFactory() { public Animal create() { return new Cat(); }});
put("Woof", new AnimalFactory() { public Animal create() { return new Dog(); }});
}});

public Animal createAnimal(String action) {
AnimalFactory factory = factoryMap.get(action);
if (factory == null) {
throw new EhException();
}
return factory.create();
}

在最初编写此答案时,针对 JDK7 的功能可能会使代码如下所示。事实证明,lambdas 出现在 Java SE 8 中,据我所知,没有 map 文字的计划。 (2016 年编辑)

private interface AnimalFactory {
Animal create();
}
private static final Map<String,AnimalFactory> factoryMap = {
"Meow" : { -> new Cat() },
"Woof" : { -> new Dog() },
};

public Animal createAnimal(String action) {
AnimalFactory factory = factoryMap.get(action);
if (factory == null) {
throw EhException();
}
return factory.create();
}

2019 年编辑:目前看起来像这样。

import java.util.function.*;
import static java.util.Map.entry;

private static final Map<String,Supplier<Animal>> factoryMap = Map.of(
"Meow", Cat::new, // Alternatively: () -> new Cat()
"Woof", Dog::new // Note: No extra comma like arrays.
);

// For more than 10, use Map.ofEntries and Map.entry.
private static final Map<String,Supplier<Animal>> factoryMap2 = Map.ofEntries(
entry("Meow", Cat::new),
...
entry("Woof", Dog::new) // Note: No extra comma.
);

public Animal createAnimal(String action) {
Supplier<Animal> factory = factoryMap.get(action);
if (factory == null) {
throw EhException();
}
return factory.get();
}

如果要添加参数,则需要将 Supplier 切换为 Factory (并且 get 变为 apply 在上下文中也没有任何意义)。对于两个参数BiFunction。超过两个参数,您又要重新尝试使其可读。

关于java - 在 Java 中创建不依赖 if-else 的工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3434466/

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