在这种情况下,如何避免所有if-Statements / Switch?

时间:2018-02-05 15:55:40

标签: java performance if-statement

我正在写一个小程序,将所有类型的单位转换为其他单位。我有gui和程序工作正常,但我觉得有更好的方法来做,因为我有很多if语句和开关。例如,如果用户想要从一种货币转换为另一种货币,他会使用保管箱选择这两种货币。让我们称他们为fromCurrencytoCurrencysolution将是最后的结果,amount是应转换的金额。计算代码如下所示:

double convertIt(String fromCurrency, String toCurrency, double amount, double solution)

 switch (fromCurrency) {

        case "Euro":
            if(toCurrency == "US-Dollar"){
                solution = amount*(1.2407);
            }
            if(toCurrency == "Canadian Dollar"){
                solution = amount*(1.5492);
            }
            // ...     
            // ... checking all possible currencies in which you could convert, then next case

我知道这对你们大多数人来说可能是非常基本的,但我现在正在努力学习java一段时间,并且想要了解如何有效和优雅地解决问题。因此,我会欣赏任何关于如何更有效地解决这个问题的提示,因为它没有这种感觉,或者至少它不会感觉优雅。例如,10种货币意味着10个开关,每个9个if语句,可能会有更多

3 个答案:

答案 0 :(得分:3)

使用类似表格的结构。

使用Guava's Table之类的结构。这些允许您将两个值映射到第三个值,就像双条目表一样。

Table<String,String,Double> currencyChanges = HashBasedTable.create();
currencyChanges.put("Euro", "US-Dollar", 1.2407);
currencyChanges.put("Euro", "Canadian Dollar", 1.5492);
...

// Later

Double currencyChange = currencyChanges.get(from, to);
solution = amout * currencyChange;

注意:您应该将BigDecimal用于货币目的,而不是双打。

答案 1 :(得分:2)

考虑选择基础货币(例如欧元)来计算所有计算。根据每种货币与欧元相比的价值创建enum

public enum Currency
{
    EUR(1.00),
    USD(1.2407),
    CAD(1.5492),
    // Any other currencies you wish to support
}

然后,只需获取您获得的金额并将其转换为欧元,然后转换为最终货币:

amount *= Currency.USD.ordinal() / Currency.CAD.ordinal();

如果美元是原始货币而CAD是最终货币。

答案 2 :(得分:0)

您应该使用密钥fromCurrency + toCurrency在地图中保存一次,其值为货币汇率

 Map<String, Double> currenciesRate = ...

在你的方法中只需获取值

 Double rate = currenciesRate.get(fromCurrency + toCurrency);
  solution = amount*rate;

最好使用自己的对象作为地图的关键。