如何在不使用 switch case 的情况下创建不同的对象类型?
How can I create different object types without using switch case?
我在 Java 完成了我的第一个 OOP 项目。这是我大学课程的一个项目,它包含一个带有 GUI 的逻辑电路模拟器。它有效,但问题是新的不同组件的创建是使用开关盒完成的,我的教授不希望我使用它。当有人按下 GUI 上的“创建”按钮时,下面的代码就会运行。类型“ComponenteLogico”是超类,类“portaAND”、“portaOR”、“portaNAND”和company 都是“ComponenteLogico”子类。我怎样才能避免开关盒?
对不起,如果我使用了糟糕的英语
int inputs=jComboBox1.getSelectedIndex()+2;
ComponenteLogico comp=null;
if(jList1.getSelectedValue() == null)
{
System.out.println("Nessun componente creato");
System.out.println("prova1");
}//nel caso dell'aggiunta di una nuova classe bisogna aggiungere la voce corrispondente nello switch case sottostante
else switch (jList1.getSelectedValue()) {
case "AND":
{
comp= new portaAND(inputs);
break;
}
case "OR":
{
comp = new portaOR(inputs);
break;
}
case "NAND":
{
comp = new portaNAND(inputs);
break;
}
case "NOR":
{
comp = new portaNOR(inputs);
break;
}
您可以按照命令 pattern/factory 模式尝试一些操作:有一个 Map<String, Function<Integer, ComponentLogico>>
,在程序启动时将其填充到某处(即在构造函数中):
class A {
private final Map<String, Function<Integer, ComponentLogico>> componentMap;
public A() {
componentMap = new HashMap<>();
// Lambda syntax
componentMap.put("AND", (inputs) -> new portaAND(inputs));
componentMap.put("OR", (inputs) -> new portaOR(inputs));
componentMap.put("NAND", (inputs) -> new portaNAND(inputs));
componentMap.put("NOR", (inputs) -> new portaNOR(inputs));
// Or use even more condensed syntax with method references:
componentMap.put("AND", portaAND::new);
componentMap.put("OR", portaOR::new);
componentMap.put("NAND", portaNAND::new);
componentMap.put("NOR", portaNOR::new);
}
public void something() {
...
String componentName = jList1.getSelectedValue();
if (!componentMap.contains(componentName)) {
// Invalid name (not in map)
}
ComponenteLogico comp = componentMap.get(jList1.getSelectedValue()).apply(inputs);
...
}
}
注意,我们有效地将每个类型的ComponenteLogico
的构造函数存储在一个Map
中,我们可以通过它的名字来获取那个构造函数。然后我们可以将此构造函数称为 Function<int, ComponenteLogico>
,它有一个方法 ComponenteLogico apply(int value)
.
我在 Java 完成了我的第一个 OOP 项目。这是我大学课程的一个项目,它包含一个带有 GUI 的逻辑电路模拟器。它有效,但问题是新的不同组件的创建是使用开关盒完成的,我的教授不希望我使用它。当有人按下 GUI 上的“创建”按钮时,下面的代码就会运行。类型“ComponenteLogico”是超类,类“portaAND”、“portaOR”、“portaNAND”和company 都是“ComponenteLogico”子类。我怎样才能避免开关盒? 对不起,如果我使用了糟糕的英语
int inputs=jComboBox1.getSelectedIndex()+2;
ComponenteLogico comp=null;
if(jList1.getSelectedValue() == null)
{
System.out.println("Nessun componente creato");
System.out.println("prova1");
}//nel caso dell'aggiunta di una nuova classe bisogna aggiungere la voce corrispondente nello switch case sottostante
else switch (jList1.getSelectedValue()) {
case "AND":
{
comp= new portaAND(inputs);
break;
}
case "OR":
{
comp = new portaOR(inputs);
break;
}
case "NAND":
{
comp = new portaNAND(inputs);
break;
}
case "NOR":
{
comp = new portaNOR(inputs);
break;
}
您可以按照命令 pattern/factory 模式尝试一些操作:有一个 Map<String, Function<Integer, ComponentLogico>>
,在程序启动时将其填充到某处(即在构造函数中):
class A {
private final Map<String, Function<Integer, ComponentLogico>> componentMap;
public A() {
componentMap = new HashMap<>();
// Lambda syntax
componentMap.put("AND", (inputs) -> new portaAND(inputs));
componentMap.put("OR", (inputs) -> new portaOR(inputs));
componentMap.put("NAND", (inputs) -> new portaNAND(inputs));
componentMap.put("NOR", (inputs) -> new portaNOR(inputs));
// Or use even more condensed syntax with method references:
componentMap.put("AND", portaAND::new);
componentMap.put("OR", portaOR::new);
componentMap.put("NAND", portaNAND::new);
componentMap.put("NOR", portaNOR::new);
}
public void something() {
...
String componentName = jList1.getSelectedValue();
if (!componentMap.contains(componentName)) {
// Invalid name (not in map)
}
ComponenteLogico comp = componentMap.get(jList1.getSelectedValue()).apply(inputs);
...
}
}
注意,我们有效地将每个类型的ComponenteLogico
的构造函数存储在一个Map
中,我们可以通过它的名字来获取那个构造函数。然后我们可以将此构造函数称为 Function<int, ComponenteLogico>
,它有一个方法 ComponenteLogico apply(int value)
.