簡體   English   中英

如何在不使用 switch case 的情況下創建不同的對象類型?

[英]How can I create different object types without using switch case?

我已經用 Java 完成了我的第一個 OOP 項目。 這是我大學課程的一個項目,它包含一個帶有 GUI 的邏輯電路模擬器。 它有效,但問題是新的不同組件的創建是使用 switch case 完成的,我的教授不希望我使用它。 當有人按下 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;
                }

您可以按照命令模式/工廠模式嘗試一些東西:有一個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);

        ...

 
    }


}

請注意,我們有效地將構造函數存儲在Map每種類型的ComponenteLogico中,我們可以在其中使用其名稱獲取該構造函數。 然后我們可以將這個構造函數稱為Function<int, ComponenteLogico> ,它有一個方法ComponenteLogico apply(int value)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM