Java枚举类型

1.使用enum状态机:一个状态机可以具有有限个特定的状态,根据输入从一个状态转移到下一个状态。在枚举类中写一个抽象方法,然后枚举类中的每个成员都继承该方法。

public enum Colour {
    Blue {
        @Override
        public Colour c() {
            return Red;
        }

        @Override
        public String s() {
            return "蓝色";
        }
    },
    Red {
        @Override
        public Colour c() {
            return Black;
        }

        @Override
        public String s() {
            return "红色";
        }
    },
    Black {
        @Override
        public Colour c() {
            return this;
        }

        @Override
        public String s() {
            return "黑色";
        }
    };

    public abstract Colour c();

    public abstract String s();

    public static void main(String[] args) {
        Colour colour = Colour.Blue;
        System.out.println("你选择了:" + colour.s());
        colour = colour.c();
        System.out.println("你选择了:" + colour.s());
        colour = colour.c();
        System.out.println("你选择了:" + colour.s());
    }
}

2.多路分发:就是一个函数处理多种类型。使用两路分发,必须有两个方法调用:第一个方法调用决定第一个未知类型,第二个方法调用决定第二个未知的类型。还要为每一个类型提供一个实际的方法调用,要处理两个不同的类型体系,就需要为每个类型体系执行一个方法调用。

enum SoThat {
    AA, BB, CC
}

interface Letter {
    SoThat compete(Letter letter);

    SoThat eval(A a);

    SoThat eval(B b);

    SoThat eval(C c);
}

class A implements Letter {

    @Override
    public SoThat compete(Letter letter) {
        return letter.eval(this);
    }

    @Override
    public SoThat eval(A a) {
        System.out.print("A vs A:");
        return SoThat.BB;
    }

    @Override
    public SoThat eval(B b) {
        System.out.print("A vs B:");
        return SoThat.AA;
    }

    @Override
    public SoThat eval(C c) {
        System.out.print("A vs C:");
        return SoThat.CC;
    }
}

class B implements Letter {

    @Override
    public SoThat compete(Letter letter) {
        return letter.eval(this);
    }

    @Override
    public SoThat eval(A a) {
        System.out.print("B vs A:");
        return SoThat.CC;
    }

    @Override
    public SoThat eval(B b) {
        System.out.print("B vs B:");
        return SoThat.BB;
    }

    @Override
    public SoThat eval(C c) {
        System.out.print("B vs C:");
        return SoThat.CC;
    }
}

class C implements Letter {

    @Override
    public SoThat compete(Letter letter) {
        return letter.eval(this);
    }

    @Override
    public SoThat eval(A a) {
        System.out.print("C vs A:");
        return SoThat.AA;
    }

    @Override
    public SoThat eval(B b) {
        System.out.print("C vs B:");
        return SoThat.AA;
    }

    @Override
    public SoThat eval(C c) {
        System.out.print("C vs C:");
        return SoThat.BB;
    }
}

public class Test {
    public static void main(String[] args) {
        Letter l1 = new A();
        Letter l2 = new B();
        SoThat soThat = l1.compete(l2);
        System.out.println(soThat);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值