【问题标题】:How can I create different object types without using switch case?如何在不使用 switch case 的情况下创建不同的对象类型?
【发布时间】:2021-11-16 00:03:48
【问题描述】:

我已经用 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;
                }

【问题讨论】:

  • ifelse if 总是可以替换任何 switch 语句。但也要找一个更好的教授,因为你写的是正确的方法。
  • 找一个更好的教授 - 或者了解教授的真正要求。
  • 他说我要尝试找到更好的解决方案,因为这不尊重开闭原则
  • 他是不是想让你用工厂来做这件事。如果这是关于开闭的,那么他可能会要求您使用工厂模式。
  • 即使移动到某个模式,也不代表开关不好,只是开关在哪里。

标签: java oop


【解决方案1】:

您可以尝试使用命令模式/工厂模式的方式:有一个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&lt;int, ComponenteLogico&gt;,它有一个方法ComponenteLogico apply(int value)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    相关资源
    最近更新 更多