将操作存储为java中的数据的最佳方法是什么?

时间:2016-05-18 20:37:54

标签: java functional-programming

我在Android应用程序中有一个类(Activity),它有一堆示例数学问题。您可以通过按一个更改问题计数器的按钮并显示一个新问题来移动到另一个问题。您可以通过单击“显示工作”按钮来查看如何解决问题,该按钮在屏幕上显示一组信息。我的问题是我有一堆看起来像这样的方法:

public void showWorkButtonClicked()
{
    if (questionCounter == 1)
        showWork1();
    else if (questionCounter == 2)
        showWork2();
    else if (questionCounter == 3)
        showWork3();
    //for how ever many questions are available
}

显然,这些if语句是可怕的设计。我可以将每个函数所需的数据存储在一个类中,这可能适用于这种情况(但可能会让事情变得混乱),但是如果每个showWork方法都足够独特以使其不切实际,那该怎么办呢?我知道如果我在C#中制作应用程序,我可以简单地将代表放入列表中,并且会有一个优雅的解决方案。如果有人有更好的解决方案(理想情况下使用更少的代码),我很乐意听到它。

2 个答案:

答案 0 :(得分:4)

使用Map<Integer, Runnable>存储您的操作:

private static Map<Integer, Runnable> actions = new HashMap<Integer, Runnable>() {{
    put(1, () -> showWork1());
    put(2, () -> showWork2());
    put(3, () -> showWork3());
}};

然后查看它们:

public void showWorkButtonClicked() {
    actions.getOrDefault(questionCounter, () -> {}).run();
}

我在这里使用&#34;什么都不做&#34;如果某个号码没有动作,则可以运行以避免NPE。或者,您可以:

public void showWorkButtonClicked() {
    Optional.of(questionCounter)
       .map(actions::get)
       .orElseThrow(IllegalArgumentException::new)
       .run();
}

答案 1 :(得分:0)

您不应该在代码中放置任何数据,也不应该使用专用函数来显示不同的内容。如果要根据计数器显示数据,请使用列表或地图进行存储,并将其读取到单个功能中进行显示。