これは、私が最近かなり直面している問題です。私はそれを機能させるための一種のハックを知っていますが、それが最善の方法であるかどうかはわかりませんが、それがリフレクションに欠ける唯一の方法であるように思われます。
私がやろうとしていること: ユーザー入力 (文字列) を通じて変更できるようにしたいクラス インスタンスがあります。たとえば、次のようになります。
public class Apple
{
private String color; //Color of the apple
private float cost; //Cost of the apple
private double radius; //Radius of the apple
public Apple()
{
this.color = "";
this.cost = 0;
this.radius = 0;
}
//The method I am concerned/talking about
public void setValue(String key, Object value)
{
if (key.equalsIgnoreCase("color"))
{
this.color = (String)value;
}
else if (key.equalsIgnoreCase("cost"))
{
this.cost= (float)value;
}
else if (key.equalsIgnoreCase("radius"))
{
this.radius = (double)value;
}
}
}
これは悪いフォームと見なされますか? 変更したいプロパティ/フィールドを識別するためのキー (文字列) をユーザーから取得し、変更したい値を示す別の文字列 (値) を取得します。確かにリフレクションは使えますが、
A) 形が悪いと聞いて眉をひそめた
B)変数名に関して完全な正確さが必要です。したがって、「appleColor」があり、ユーザーが「applecolor」を入力すると、機能しません。または、「applecolor」があり、ユーザーが「color」などを入力できるようにしたい場合。
これを行うための、より構造化された/オブジェクト指向の/便利な方法があるかどうか疑問に思っています。おそらく、「setValue()」を必要とする各クラスに、プロパティ/フィールドをその文字列キーに一致させる HashMap を持たせることを考えましたが、「getHashMap()」などのメソッドを使用してそれを実現する必要があるかどうかはわかりませんハッシュマップを返す
hashMap.put("color", color)... または何。
この問題を処理する設計パターンの方向性を私に示しているだけであっても、助けていただければ幸いです。