加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何替换if的长链

发布时间:2020-12-15 04:31:56 所属栏目:Java 来源:网络整理
导读:我有一个包含3个整数i,j和k的对象. 那些整数可以有一个减号(M),一个加号(P)或者为空(O). 因此,任何此类对象都可以归类为以下类别之一: MMM,MMP,MPM,MPP,PMM,PMP,PPM,PPP,OMM,OMP,OPM,OPP,MOM,MOP,POM,POP,MMO,MPO,PMO,PPO,MOO,POO,OMO,OPO,OOM,OOP,OOO. 我
我有一个包含3个整数i,j和k的对象.

那些整数可以有一个减号(M),一个加号(P)或者为空(O).

因此,任何此类对象都可以归类为以下类别之一:
MMM,MMP,MPM,MPP,PMM,PMP,PPM,PPP,OMM,OMP,OPM,OPP,MOM,MOP,POM,POP,MMO,MPO,PMO,PPO,MOO,POO,OMO,OPO,OOM,OOP,OOO.

我想对这种类型的对象执行计算,这些对象将根据对象的类别而有所不同.

我的对象不仅包含这三个整数,还包含将在计算中使用的其他信息.

我的两个问题是:

>如何从i,j和k值中推导出对象的类别?
>如何实现正确算法的选择?

我做了一个天真的实现,使用枚举和很多if … else,但我对结果不满意,尤其是if … else部分.

任何更好,更面向对象的想法?

数据类:

public class Data {
    private int i,j,k;
    private double otherData;
    private Category category;

    public void init(int i,int j,int k) {
        this.i = i;
        this.j = j;
        this.k = k;

        if (i < 0) {
            if (j < 0) {
                if (k < 0) {
                    category = Category.MMM;
                } else if (k > 0) {
                    category = Category.MMP;
                } else//(k >= 0)
                {
                    category = Category.MMO;
                }
            } else//(j >= 0)
            {
                if (k < 0) {
                    category = Category.MPM;
                    if (j == 0)
                        category = Category.MOM;
                } else//(k >= 0)
                {
                    if ((j == 0) && (k == 0))
                        category = Category.MOO;
                    else if (k == 0)
                        category = Category.MPO;
                    else if (j == 0)
                        category = Category.MOP;
                    else
                        category = Category.MPP;
                }
            }
        } else//(i >= 0)
        {
            if (j < 0) {
                if (k < 0) {
                    category = Category.PMM;
                    if (i == 0)
                        category = Category.OMM;
                } else//(k >= 0)
                {
                    if ((i == 0) && (k == 0))
                        category = Category.OMO;
                    else if (k == 0)
                        category = Category.PMO;
                    else if (i == 0)
                        category = Category.OMP;
                    else
                        category = Category.PMP;
                }
            } else//(j >= 0)
            {
                if (k < 0) {
                    if ((i == 0) && (j == 0))
                        category = Category.OOM;
                    else if (i == 0)
                        category = Category.OPM;
                    else if (j == 0)
                        category = Category.POM;
                    else
                        category = Category.PPM;
                } else//(k > 0)
                {
                    if (i == 0) {
                        if (j == 0)
                            category = Category.OOP;
                        else if (k == 0)
                            category = Category.OPO;
                        else
                            category = Category.OPP;
                    } else {
                        if ((j == 0) && (k == 0))
                            category = Category.POO;
                        else if (j == 0)
                            category = Category.POP;
                        else if (k == 0)
                            category = Category.PPO;
                        else
                            category = Category.PPP;
                    }
                }
            }
        }
    }

    public void computeSomething() {
        category.computeSomething(this);
    }

    public double getOtherData() {
        return otherData;
    }

    public void setOtherData(double otherData) {
        this.otherData = otherData;
    }
}

枚举类:

public enum Category {
    MMM {
        @Override
        public void computeSomething(Data data) {
            // Do something
        }
    },MMP {
        @Override
        public void computeSomething(Data data) {
            // Do something else
        }
    }
    // Omitted code for clarity

    public abstract void computeSomething(Data data);
}

有关完整用例上下文,请参见参见http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.147.2010&rep=rep1&type=pdf

解决方法

此代码等同于您的init方法:

public void init(int i,int k) {
    this.i = i;
    this.j = j;
    this.k = k;
    category=Category.valueOf( (i<0?"M":(i==0?"O":"P"))
                              +(j<0?"M":(j==0?"O":"P"))
                              +(k<0?"M":(k==0?"O":"P")));
}

正如@Robert所建议的那样,你也可以这样做:

private void init(int i,int k){
    this.i = i;
    this.j = j;
    this.k = k;
    category = Category.fromInts(i,k);
}

enum Category {
        MMM,OOO;

        static Category fromInts(int i,int k){
            return Category.valueOf( (i<0?"M":(i==0?"O":"P"))
                                    +(j<0?"M":(j==0?"O":"P"))
                                    +(k<0?"M":(k==0?"O":"P")));
        };
}

关于计算算法的选择,从枚举中删除它可能是一个好主意,并采取类似这样的方法:

public class Data {
    ...
    public void computeSomething() {
        swith(category){
            case MMM : computeMMM();break;
            case MMO : computeMMO();break;
            ...
        }
    }

    private void computeMMM(){
        ...
    }

    private void computeMMO(){
        ...
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读