java enum多路分发下浅识表驱动式编程

 由于java的动态绑定只能处理一个类型,所以如果要执行的操作包含不止一个类型未知的对象时,就需要使用多路分发.其中多路分发使用了多态机制,所以只能发生在方法调用时.以石头,剪刀,布的例子说明

    1 使用enum分发

    定义返回结果:

    

package enumeration;

public enum Outcome {
    WIN,LOSE,DRAW
}

 

    使用构造器来初始化每个enum实例

    

复制代码
package enumeration;

import static enumeration.Outcome.*;

public enum RoShamBo {
    //初始化
    PAPER(DRAW, LOSE, WIN), SCISSORS(WIN, DRAW, LOSE), ROCK(LOSE, WIN, DRAW);
    private Outcome vPAPER, vSCISSORS, vROCK;

    RoShamBo(Outcome paper, Outcome scissors, Outcome rock) {
        this.vPAPER = paper;
        this.vSCISSORS = scissors;
        this.vROCK = rock;
    }
    
public Outcome compete(RoShamBo it) { switch (it) { default: case PAPER: return vPAPER; case SCISSORS: return vSCISSORS; case ROCK: return vROCK; } } }
复制代码

这个简单例子中用3个枚举实例,每个枚举实例又包含3个结果,构建了一个3*3的二维表.

取得的效果是:只有第一次分发是实际调用,第二次分发使用的是switch

 

2 使用二维数组

 

复制代码
package enumeration;

import static enumeration.Outcome.*;

public enum RoShamBo2 {
    PAPER, SCISSORS, ROCK;
    //结果表
    private static Outcome[][] table = { { DRAW, LOSE, WIN }, // PAPER
            { WIN, DRAW, LOSE }, // SCISSORS
            { LOSE, WIN, DRAW },// ROCK
    };

    public Outcome compete(RoShamBo2 other) {
        return table[this.ordinal()][other.ordinal()];
    }
}
复制代码

 

这种方法直接构建一个二维数组按规定好的顺序储存结果

取得的效果是:只有第一次分发仍是实际调用,第二次分发却使用的更简便的数组索引,表达力强大,代码简短

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值