![](/img/trans.png)
[英]How to output a date using a switch statement with nested if-else statements
[英]Is it possible to replace if-else with switch statement using strings as switching values?
我想知道在这种情况下是否可以使用switch语句代替if-else语句。 变量来自JComboBoxes,并在此处由ActionEvent处理:
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if (source == comboUnit) {
String unit = comboUnit.getSelectedItem().toString();
if (unit.equals("Unit 1")) {
unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * defined1;
labelDesc.setText("Unit 1");
convert();
}
else if (unit.equals("Unit 2")) {
unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * defined2;
labelDesc.setText("Unit 2");
convert();
}
(...)
我试图将纯字符串作为值传递,但没有成功。 您是否应该完成操作(如果可能)有任何提示吗?
Java 7允许您switch
String
。
但是他们说如果有人饿了,最好教他们怎么钓鱼,而不是给他们一条鱼。 从长远来看。 我要说的是您的代码需要重构,其次才是使用switch
或枚举或映射 。
您实际上有太多重复的代码要做相同的事情。 我指的是:
unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * defined1;
labelDesc.setText("Unit 1");
convert();
显然,由于根据使用的单位使用不同的因子相乘,因此需要具有对要使用的因子进行评估的单位功能。 在少数学术语,你需要的东西,要么产生的价值defined1
或defined2
根据提供的字符串。 您已经具有引用所涉及unit
的“名称”的单元,可以使用它。 我将方法返回为factor的factor
,接受一个单位名称并返回一个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
的解决方案有点混乱。 如果有人可以用枚举做得更好,那么自然而然地采用他们的代码。
通常,最短的代码是最好的,因为它更易于阅读和理解。 但是请谨慎使用地图-它们比其他解决方案产生更多的开销,因此我更喜欢在地图较少且每个地图具有多个键的情况下使用它们,而不是相反。
您可以使用Enum
并将字符串替换为Enum值
public static void main(String[] args) {
Units unit = Units.Unit1;
switch (unit) {
case Unit1:
break;
case Unit2:
break;
}
}
enum Units {
Unit1, Unit2,
}
Java 7允许您在switch语句中使用字符串
你的意思是像
switch (unit) {
case "Unit 1":
// do something
break;
case "Unit 2":
}
?
是的,可以,从Java7开始。
但就您而言,您似乎既不需要切换,也不需要/其他。 在两种情况下,您都做相同的事情:
String unit = comboUnit.getSelectedItem().toString();
unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * defined1;
labelDesc.setText(unit);
convert();
仅在Java 7和更高版本中,才可以在switch-case语句中使用Strings。 这是文档的链接,您需要向下滚动到String部分。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.