亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

替換 switch 語句 Java

替換 switch 語句 Java

郎朗坤 2022-07-14 16:53:41
我一直想知道是否有辦法替換我擁有的當前 switch 語句。下面是我擁有的代碼示例,盡管我擁有的語句要長得多,而且只會變得更大。switch 方法通過文件讀取器調用,因此它讀取一行,然后調用此函數并分配值。public static void example(String action, String from, String to){ switch (action) {           case ("run"):                runTo(from,to);                break;           case ("walk"):                walkTo(from,to);                break;           case ("hide"):                hideAt(to);                break;            } }編輯:我很好奇是否有更好的方法來代替使用上述場景的 switch 語句。我對示例進行了一些更新,以使其更有意義。一些方法調用不需要使用所有參數。
查看完整描述

4 回答

?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

對于 Java 7 及以下版本,我們可以為函數實現聲明一個接口。


對于 Java 8+,我們可以使用Function接口。


界面:


public interface FunctionExecutor {

    public Object execute(String from,String to);


}

函數上下文:


public class FunctionContect {

   HashMap<String, FunctionExecutor> context=new HashMap<String, FunctionExecutor>();


    public void register(String name,FunctionExecutor function){

        context.put(name, function);

    }


   public Object call(String name,String from,String to){

      return    context.get(name).execute(from, to);

   }


   public FunctionExecutor get(String name){

      return context.get(name);

   }


  }

功能實現:


public class RunFunctionImpl implements FunctionExecutor{


    @Override

    public Object execute(String from, String to) {

       System.out.println("function run");

        return null;

   }


}


// OTHER FUCNTIONS

注冊功能:


    FunctionContect contex = new FunctionContect();

    contex.register("run", new RunFunctionImpl());

    contex.register("walk", new WalkFunctionImpl());

    contex.register("hide", new HideFunctionImpl());

調用函數


 context.call(action, from, to);

或者


 context.get(action).execute(from,to);


查看完整回答
反對 回復 2022-07-14
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

擺脫 switch 的一種可能選擇是使用函數的 hashmap:


private String stringMethod(final String action, final String source) {


    final Function<String, String> toLowerFunction = String::toLowerCase;

    final Function<String, String> toUpperFunction = String::toUpperCase;


    final HashMap<String, Function<String, String>> stringFunctions = new HashMap<>();

    stringFunctions.put("toLower", toLowerFunction);

    stringFunctions.put("toUpper", toUpperFunction);


    return stringFunctions.get(action).apply(source);

}


查看完整回答
反對 回復 2022-07-14
?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

我不完全確定你想要實現什么。如果你不想繼續添加新的


case ("ccc"):

  Lmn(b,c,i);

  break;         

塊。


您可以散列 a 中的HashMap<string, method>方法并使用鍵從映射中獲取方法并執行它。


查看完整回答
反對 回復 2022-07-14
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

如果您在同一個變量上有重復的 switch 案例,例如在 methodf和. 然后你可以把事情從里到外:gh


void f(String a) {

    switch (a) {

    case "aaa": ... ; break;

    ...

    }

}


void g(String a) {

    switch (a) {

    case "aaa": ... ; break;

    case "bbb": ... ; break;

    case "ccc": ... ; break;

    ...

    }

}


void h(String a) {

    switch (a) {

    case "aaa": ... ; break;

    ...

    }

}

可以將面向對象處理為:


class C {

    public f() { }

    public g() { }

    public h() { }

}


class Aaa extends C {

    @Override

    public f() { test3(b,c); } // Or even just the body of test3

    @Override

    public g() { }

    @Override

    public h() { }

}


class Bbb extends C {}

class Ccc extends C {}

然后一旦必須提供特定的 C:


    C c;

    switch (a) {

    case "aaa": c = new Aaa(); break;

    case "bbb": c = new Bbb(); break;

    case "ccc": c = new Ccc(); break;

    ...

    }


    c.f(...);


    c.g(...);


    c.h(...);

這看起來是間接的,但實際上提高了開發質量。添加新案例并不意味著搜索所有開關案例。


一種情況(“aaa”)的代碼都在一個類中,具有自己的專用字段。這可以簡化事情并提供更好的概覽。


查看完整回答
反對 回復 2022-07-14
  • 4 回答
  • 0 關注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號