在Java中处理参数过多的智能if else方式

huangapple go评论82阅读模式
英文:

Smart way to do if else in Java where the number of parameters is too big

问题

以下是翻译好的内容:

我正在将一个参数名称作为输入传递给我的函数,该参数可以是 "Numeric" 或 "currency" 类型。根据类型,我需要在最终将其打印到使用 Apache POI 库的 Excel 文件之前进行一些格式化。为了检查接收到的参数是否属于这两个类别中的任何一个,我正在进行如下检查:

// 格式化货币或数字列
if (DcHandlerConstant.currencyColumnList().contains(String.valueOf(key))) {
    DecimalFormat df = new DecimalFormat("'$'0.00");
    df.setGroupingUsed(true);
    df.setGroupingSize(3);
    value = df.format(input);
}
if (DcHandlerConstant.numericColumnList().contains(String.valueOf(key))) {
    DecimalFormat df = new DecimalFormat("0.00");
    df.setGroupingUsed(true);
    df.setGroupingSize(3);
    value = df.format(input);
}

其中,列表包含可能的输入名称。我之所以这样使用,而不是在 if 语句中硬编码该值,是因为参数的数量太多了。目前每个列表中有 10 个元素,而且预计将来会进一步增加,我们预计每个列表中将有近 20 个元素。

但在测试过程中,我观察到 ArrayList 中的 contains 方法需要大量的时间。以下是来自 Visual VM 的快照:

(图片链接不可用)

那么,在不使用 ArrayList 的情况下,如何使用预期的功能?枚举类型是否会是更快的方法?

英文:

I am getting a parameter name as the input to my function which can be of type "Numeric" or "currency". Based on the type, I need to do some formatting before ultimately printing that in an excel file using Apache POI library. to check whether the received parameter belongs to either of the categories, I am doing the check like the following:

//Format the columns currency or numeric
    if (DcHandlerConstant.currencyColumnList().contains(String.valueOf(key))) {
        DecimalFormat df = new DecimalFormat("'$'0.00");
        df.setGroupingUsed(true);
        df.setGroupingSize(3);
        value = df.format(input);
    }
    if (DcHandlerConstant.numericColumnList().contains(String.valueOf(key))) {
        DecimalFormat df = new DecimalFormat("0.00");
        df.setGroupingUsed(true);
        df.setGroupingSize(3);
        value = df.format(input);
    }

where the lists contain the possible input name. I used it like this instead of hard-coding the value in the if clause because the number of parameters is too long, ATM it has 10 elements each and it is only going to increase further, we are expecting almost 20 in each list.

But during the testing I observed that this contains method in the arraylist is taking an awful lot of time. Below is a snapshot from Visual VM:

在Java中处理参数过多的智能if else方式

So how can I use the intended functionality without using Arraylist? Will enum be a faster approach?

答案1

得分: 1

如果所有的货币或数字类型都是唯一的,那么请使用一个集合,具体来说是 HashSet。如果您可以预先定义货币和数字类型,那么请使用枚举(Enum)和枚举集合(EnumSet)。

英文:

If all of the currency or numeric types are unique then use a Set, specifically a HashSet. If you can predefine the currency and numeric types then use a Enum and an EnumSet.

huangapple
  • 本文由 发表于 2020年4月6日 01:58:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/61047025.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定