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