采用模块化实现方式的系带开关



我有两个字符串s1,s2。它们可以拥有任何类型的整数,浮点数,列表,地图等数据。并且需要根据类型进行比较。 字符串可以是"1","二","一,二,三","{一=1,二=2}"等。我们还将知道字符串的数据类型。

目前,我已经写了一个开关语句

switch(datatype)
{  
case A: 
case B:
default: 
}

但是,我需要转换为模块化方式,并根据类型消除开关调用适当的函数,如果不是这样的话。

如何将字符串动态转换为特定数据类型并进行相应的调用?或者任何其他方式通过女巫开关,或者如果可以消除的话。

如果我理解正确,您将数据存储为字符串,但它们可以表示不同类型的数据。现在,您希望以与类型相关的方式比较它们,但您不喜欢您的开关解决方案,因为它要求所有比较逻辑都采用相同的方法。

我看到两种可能的解决方案。

首先,如果数据类型属于您控制下的自定义类,则可以向其添加compare方法:

abstract boolean compare(String a, String b); // or whetever return type you need

然后你需要在所有子类中实现。然后你可以称之为:

result = datatype.compare(a, b)

请注意,如果数据类型是枚举,您也可以执行此操作。

其次,如果您的数据类型不是受控制的自定义类,则可以使用 map:

Map<DataType, ComparisonFunction> comparisonFunctions = ...;

其中ComparisonFunction是一个类或(功能(接口。对于您支持的每种数据类型,您都可以创建它的实现。然后从地图中获得所需的比较函数:

ComparisonFunction function = comparisonFunctions.get(datatype);
if (function == null) {
throw new IllegalArgumentException("Unknown datatype: " + datatype);
}
result = function.apply(a, b);

第二个解决方案具有可以在运行时更改映射的属性。(这是优点还是缺点取决于您的特定要求。

最新更新