Re: [問題] java 不寫判斷式的方法(if else switch )

作者: LaPass (LaPass)   2016-03-06 20:02:58
※ 引述《a1098137129 (純喫茶好喝)》之銘言:
: 第一次在java版發文因為小弟遇到一個問題
: 之前寫python程式的時候小弟會盡量不用if else或switch case
: 而是用查表法,但是我的表裡是存函式
: 舉個例子:
: 當我要判斷x的值為1的時候就做function a()
: 而2時就做function b()
: 因此就會寫成如下
: array={a,b}
: array[x]()
: 這樣的寫法可以容易閱讀又可以省略冗長的程式碼
: 個人覺得非常好用。
: 但是最近想試試看java卻都無法,
: 想請問班上的大大知道要怎麼做嗎
: ps:有查到state patern可以一樣不用的判斷式,
: 可是我太魯了 還沒學到他的精髓,
: 所以不太會設計,
: 或是同樣的方法要怎麼用state patern我也很想知道
: 謝謝各位大大
概念: 把method當成物件
舉例來說,你可以設計一個interface當成裝著method的物件
interface IFunc{
boolean call();
}
然後你的「判斷」可以用這種方式去寫
class CheckX implement IFunc {
public boolean call(){
return true;
}
}
然後你的判斷放到 map 裡面
Map<String,IFunc> map = new HashMap<>();
map.put("x",new CheckX);
要使用判斷時,就從map找出來用。
if(map.get("x").call()){
// x check ok
}
//=======================================
以上是基本觀念,你可以搭配 Lambda 跟 泛型去處理這種問題
也可以搭配map的key的種類不同,以及介面的不同,去處理問題
interface IFunc<R,T>{
R call(T t);
}
//訊息介面 Msg
interface Msg{
}
//訊息的物件
class User implement Msg{
}
//訊息的物件
class Admin implement Msg{
}
//檢查判斷
class CheckUser implement IFunc<Boolean,Msg>{
public Boolean call(Msg msg){
User u=(User)msg;
//對使用者的處理
return true;
}
}
//使用上
Map<Class,IFunc<Boolean,Msg>> map=new HashMap<>();
//物件方式
map.put(User.class,new CheckUser());
//Lambda方式
map.put(Admin.class,(msg)->{
Admin a=(Admin)msg;
//a的判斷
return true;
});
使用上是這樣
void check(Msg msg){
if(map.get(msg.getClas()).call(msg)){
//檢查OK
}else {
//檢查失敗
}
}
大致上是這樣子運作的
跟腳本類的語言會有些不一樣
作者: a1098137129 (純喫茶好喝)   2016-03-06 21:32:00
謝謝LaPass大解答

Links booklink

Contact Us: admin [ a t ] ucptt.com