Java 7を使用すると、次のことが可能になりswitch
ますString
。
しかし、彼らは、誰かが空腹なら、魚を与えるよりも、釣り方を教える方が良いと言います。長い目で見れば。私が得ているのは、コードのリファクタリングが必要であり、列挙switch
またはマップを使用するかどうかは、2番目に来るものです。
本質的に同じことをしている重複コードが多すぎます。私が言及しているのは:
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
ベースのソリューションは、ユニット名、列挙定数、およびそれらの値の間の関係のため、少し厄介です。誰かが列挙型でもっとうまくやれるなら、当然、代わりに彼らのコードを取りなさい。
通常、読みやすく、ほとんどの場合理解できるので、最短のコードが最適です。ただし、マップには注意してください。他のソリューションよりもオーバーヘッドが大きくなるため、マップの数が少なく、それぞれに多くのキーがある場合は、その逆ではなく、マップを使用することをお勧めします。