![](/img/trans.png)
[英]Why there is no compilation error when I am using different data types for switch expression and case value in this 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.