java – 如何替换if的长链
我有一个包含3个整数i,j和k的对象.
那些整数可以有一个减号(M),一个加号(P)或者为空(O). 因此,任何此类对象都可以归类为以下类别之一: 我想对这种类型的对象执行计算,这些对象将根据对象的类别而有所不同. 我的对象不仅包含这三个整数,还包含将在计算中使用的其他信息. 我的两个问题是: >如何从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(){ ... } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |