我遇到了一个问题,我不允许使用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 我将这些字符串拆分为“
我得到了一个配置文件,我读到了这个:
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.