我有一个包含 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,面向对象,面向对象。
我想对这种类型的对象执行计算,该计算将根据对象的类别而有所不同。
我的对象不仅包含这三个整数,还包含将在计算中使用的其他信息。
我的两个问题是:
如何根据对象的 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
最佳答案
此代码等同于您的初始化方法:
public void init(int i, int j, 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 j, int k){
this.i = i;
this.j = j;
this.k = k;
category = Category.fromInts(i,j,k);
}
enum Category {
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;
static Category fromInts(int i, int j, 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(){
...
}
}
关于java - 如何替换长链的if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34957241/