wg1*_*sic 5 java polymorphism if-statement object
我遇到了一个问题,我不允许使用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
Run Code Online (Sandbox Code Playgroud)
我将这些字符串拆分为";",因此将其保存在数组中.我遇到的问题是,我需要在代码中为代码中的其他内容执行其他操作ar [3],所以如果是一个月我还需要其他计算,那么当它是一整年时.
但我不允许用Switch/case或If/Else这样做,现在我感到困惑.
If (ar[3] = month){
do this;
else if (ar[3] = year) {
do this;
}
Run Code Online (Sandbox Code Playgroud)
我如何做这个面向对象?谢谢你的每一个帮助:)
看来您需要某种基于 ar[3] 中时间段的继承结构。可以针对每种情况对特殊do this方法进行编码。这样你就能够针对每种情况做不同的事情。您只需要一种方法来首先实例化正确的子类型。有多种方法可以解决这个问题。
恕我直言,最直接的方法是条件运算符?:。
所以代码看起来像这样:
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();
Run Code Online (Sandbox Code Playgroud)
嵌套的条件表达式使您能够选择正确的类,而继承则为您提供所需的多态行为。
但您在评论中提到您也不能使用?:. 接下来是什么?
假设您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());
}
Run Code Online (Sandbox Code Playgroud)
并doSomething()以ar参数调用:
MyClass x = themap.get(ar[3]);
if (x != null)
x.doSomething(ar);
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以做到这一点。坚持这个Map概念,您可以将类文字存储在实例中Map,而不是实例中,然后反射性地实例化它们。您还可以在 中保留 lambdaMap并调用它。
@OldCurmudgeon 建议使用枚举。如果将这些枚举放入 并向Map枚举添加 lambda,则可以获取枚举并调用 lambda。这会起作用并且具有一定的吸引力,但似乎没有必要。你最好直接调用 lambda。