Java 7 允许您switch
在String
s.
但是他们说如果有人饿了,最好教他们如何钓鱼,而不是给他们一条鱼。从长远来看。我的意思是你的代码需要重构,是使用枚举还是映射switch
是第二个问题。
你有太多重复的代码在做同样的事情。我指的是:
unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * defined1;
labelDesc.setText("Unit 1");
convert();
显然,因为您根据使用的单位使用不同的因子进行乘法运算,所以您需要一个对要使用的因子进行单位评估的函数。用较少的数学术语来说,您需要一些能够产生defined1
或者defined2
取决于提供的字符串的值的东西。您已经有了相关unit
单位的“名称”,您可以使用它。我调用返回因子的方法factor
,接受单位名称并返回a Number
(因为无论您是乘以整数还是某种实数,它都没有遵循您的示例)。我还假设您的defined1
等defined2
是变量或文字。
unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * factor(unit);
labelDesc.setText(unit);
convert();
Number factor(String unitName)
{
switch(unitName)
{
case "Unit 1": return defined1;
case "Unit 2": return defined2;
default: throw new Exception("Unknown unit");
}
}
该方法本身就是您的“切换或不切换”问题蔓延的地方。如果您愿意,您可以自由使用地图:
Map<String, Number> unitNameValueMap = new HashMap<String, Number>();
unitNameValueMap.put("Unit 1", defined1);
unitNameValueMap.put("Unit 2", defined2);
Number factor(String unitName)
{
Number result = unitNameValueMap.get(unitName);
if(result == null)
{
throw new Exception("Unknown unit");
}
return result;
}
或者您可以使用枚举:
enum UnitValue
{
UNIT1(defined1), UNIT2(defined2);
final Number value;
private UnitValue(Number value)
{
this.value = value;
}
}
Number factor(String unitName)
{
return Enum.valueOf(UnitValue.class, "UNIT" + Integer.parseInt(unitName.substring(5)).value;
}
您甚至可以switch
或在枚举中使用映射,这也将为您提供良好的代码可读性。
您需要分析您的程序以查看您是否需要switch
基于 - 的解决方案或基于枚举的解决方案或基于地图的解决方案。它当前的方式以及您自己可以看到的方式,enum
基于 - 的解决方案有点混乱,因为您的单位名称、枚举常量和它们的值之间的关系。如果有人可以用枚举做得更好,那么自然而然地取而代之的是他们的代码。
通常,最短的代码是最好的,因为它更容易阅读并且最容易理解。但是要小心使用地图——它们比其他解决方案产生更多的开销,所以我更喜欢在地图较少且每个有很多键的情况下使用它们,而不是相反。