私は次の問題を抱えており、それに対する効率的な解決策があるかどうか疑問に思います。(私はJavaを使用しています)
異なる名前の変数に同じデータを保持する複数の異なるタイプのクラスがあり、これが与えられていると考えてください。
ここに例があります:コンテナクラス内のメンバーとして3つの経験値があると想像してください
- ショートカラー
- intサイズ
- ひも形
2つのクラスを検討します
- class1
- class2
class1には、経験値である3つのメンバー変数があります。
- 短いrgb_color->色に対応
- 長い大きさ->大きさに対応
- 文字列の輪郭->形状に対応
class2には、経験値である3つのメンバー変数があります。
- intcmyk->色に対応
- intgreatness->bignessに対応
- 文字列shapecountour->形状に対応
ご覧のとおり、名前は異なります。したがって、クラス1と2の値をコンテナークラスにインポートする場合は、コンテナークラスに追加するためにすべてのパラメーターを単独で変換する必要があります。したがって、メンバー変数があるため、入力する必要があります(ここでは6 )たとえば、インポート関数については、次の擬似コードを参照してください。
public void import(class1 class){
this.color = (short) class.rgb_color;
this.size = (int) class.bigness;
this.shape = (String) class.contour;
}
public void import(class2 class){
this.color = (short) class.cmyk;
this.size = (int) class.greatness;
this.shape = (String) class.shapecontour;
}
ここで、はるかに多くのパラメーターがある問題を想像してみてください。メンバーごとに1つずつインポートを解決する一般的な方法はありますか?
ご協力ありがとうございました。
編集:速い答えをすでにありがとう。私が言ったように、私はclass1とclass2を変更することはできません。
フィールドを変更するためのこの例があるリフレクションを確認しました。
public class Book {
public long chapters = 0;
public String[] characters = { "Alice", "White Rabbit" };
public Tweedle twin = Tweedle.DEE;
public static void main(String... args) {
Book book = new Book();
String fmt = "%6S: %-12s = %s%n";
try {
Class<?> c = book.getClass();
Field chap = c.getDeclaredField("chapters");
out.format(fmt, "before", "chapters", book.chapters);
chap.setLong(book, 12);
out.format(fmt, "after", "chapters", chap.getLong(book));
Field chars = c.getDeclaredField("characters");
out.format(fmt, "before", "characters",
Arrays.asList(book.characters));
String[] newChars = { "Queen", "King" };
chars.set(book, newChars);
out.format(fmt, "after", "characters",
Arrays.asList(book.characters));
Field t = c.getDeclaredField("twin");
out.format(fmt, "before", "twin", book.twin);
t.set(book, Tweedle.DUM);
out.format(fmt, "after", "twin", t.get(book));
// production code should handle these exceptions more gracefully
} catch (NoSuchFieldException x) {
x.printStackTrace();
} catch (IllegalAccessException x) {
x.printStackTrace();
}
}
}
ただし、各変数を「章」などの名前で呼び出す必要があります。何が間違っていますか?