0

この場合、if-elseの代わりにswitchステートメントを使用できるかどうか疑問に思っています。変数は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();
        }
(...)

純粋な文字列を値として渡そうとしましたが、成功しませんでした。それがどのように行われるべきか(そしてそれが可能であるかどうか)について何かヒントはありますか?

4

4 に答える 4

3

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(整数を乗算するのか、ある種の実数を乗算するのかは、例からはわからないため)。また、あなたdefined1defined2などは変数またはリテラルであると想定しています。

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ベースのソリューションは、ユニット名、列挙定数、およびそれらの値の間の関係のため、少し厄介です。誰かが列挙型でもっとうまくやれるなら、当然、代わりに彼らのコードを取りなさい。

通常、読みやすく、ほとんどの場合理解できるので、最短のコードが最適です。ただし、マップには注意してください。他のソリューションよりもオーバーヘッドが大きくなるため、マップの数が少なく、それぞれに多くのキーがある場合は、その逆ではなく、マップを使用することをお勧めします。

于 2012-10-17T18:35:03.240 に答える
1

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ステートメントで文字列を使用できます

于 2012-10-17T18:34:59.897 に答える
1

あなたは

switch (unit) {
case "Unit 1":
  // do something
  break;

case "Unit 2":

}

はい、できます。Java7から始めます。

しかし、あなたの場合、切り替えもif/elseも必要ないようです。どちらの場合も同じことをします:

 String unit = comboUnit.getSelectedItem().toString();
 unitValue = Double.parseDouble(tfUnit.getText());
 valMeter = unitValue * defined1;
 labelDesc.setText(unit);
 convert();
于 2012-10-17T18:35:19.280 に答える
0

Java 7 以降でのみ、switch-case ステートメントで文字列を使用できます。ここにドキュメントへのリンクがあります。下にスクロールして String セクションに移動する必要があります。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

于 2012-10-17T18:36:52.820 に答える