当前位置 : 主页 > 手机开发 > 其它 >

面向对象的编程 – 避免使用Switch / Case和If / else(JAVA)

来源:互联网 收集:自由互联 发布时间:2021-06-19
我遇到了一个问题,我不允许使用switch / case或if / else查询. 我得到了一个配置文件,我读到了这个: 650;0;1.5;month614;0;2.88;year466;0;2.48;week716;0;4.6;half-year718;0;2.6;quarter 我将这些字符串拆分为“
我遇到了一个问题,我不允许使用switch / case或if / else查询.

我得到了一个配置文件,我读到了这个:

650;0;1.5;month
614;0;2.88;year
466;0;2.48;week
716;0;4.6;half-year
718;0;2.6;quarter

我将这些字符串拆分为“;”,因此将其保存在数组中.我遇到的问题是,我需要在代码中为代码中的其他内容执行其他操作ar [3],所以如果是一个月我还需要其他计算,那么当它是一整年时.

但我不允许用Switch / case或If / Else这样做,现在我感到困惑.

If (ar[3] = month){
do this;
else if (ar[3] = year) {
do this; 
}

我如何做这个面向对象?谢谢你的每一个帮助:)

遗传多态是你的朋友

看起来你需要某种基于ar [3]中的时间段的继承结构.特殊的做法可以为每种情况编码.这样你就能够为每种情况做一些不同的事情.您只需要一种方法来首先实例化正确的子类型.有很多方法可以解决这个问题.

条件运算符

最直接的方法恕我直言是条件运算符,?:.

所以代码看起来像这样:

MyClass x = ar[3].equals("month") ? new MyClassMonth() :
            (ar[3].equals("year") ? new MyClassYear() :
            (ar[3].equals("week") ? new MyClassWeek() :
            (ar[3].equals("half-year") ? new MyClassHalfyear() :
                                        new MyClassQuarter())));
x.doSomething();

嵌套的条件表达式使您能够选择正确的类,继承为您提供所需的多态行为.

但你在评论中提到你也不能使用?:.接下来是什么?

无状态对象的地图

假设您编写了MyClassMonth,其中任何内容都不依赖于任何记忆状态,即doSomething()方法没有副作用.然后你可以创建一个Map< String,MyClass>存储每个子类的一个实例,然后在需要调用时将相关的一个拉出地图.

你要像这样初始化地图:

final Map<String, MyClass> themap = new HashMap<>();
{
  themap.add("month", new MyClassMonth());
  themap.add("year", new MyClassYear());
  themap.add("week", new MyClassWeek());
  themap.add("half-year", new MyClassHalfyear());
  themap.add("quarter", new MyClassQuarter());
}

并使用ar作为参数调用doSomething():

MyClass x = themap.get(ar[3]);
if (x != null)
  x.doSomething(ar);

其他选择

还有其他方法可以做到这一点.坚持使用Map概念,您可以将类文字存储在Map而不是实例中,然后以反射方式实例化它们.您还可以在Map中保留lambda并调用它.

枚举

@OldCurmudgeon建议使用枚举.如果你将这些枚举放入Map并将一个lambda添加到枚举中,你可以获取枚举并调用lambda.这可行,并具有一定的吸引力,但似乎没有必要.你最好直接调用lambda.

网友评论