0

私は次の問題を抱えており、それに対する効率的な解決策があるかどうか疑問に思います。(私はJavaを使用しています)

異なる名前の変数に同じデータを保持する複数の異なるタイプのクラスがあり、これが与えられていると考えてください。

ここに例があります:コンテナクラス内のメンバーとして3つの経験値があると想像してください

  1. ショートカラー
  2. intサイズ
  3. ひも形

2つのクラスを検討します

  1. class1
  2. class2

class1には、経験値である3つのメンバー変数があります。

  1. 短いrgb_color->色に対応
  2. 長い大きさ->大きさに対応
  3. 文字列の輪郭->形状に対応

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();
    }
    }
}

ただし、各変数を「章」などの名前で呼び出す必要があります。何が間違っていますか?

4

3 に答える 3

0

java Reflection apiを使用して、使用可能なフィールドのリストを取得し、タイプごとに照合することができます。

于 2012-08-17T12:38:58.163 に答える
0

これを行って、デザインを少し変更してみませんか。親クラスを作成し、それらのパラメーターを親クラスにプルして、Class1、Class2に新しい親クラスを拡張させます。次に、これらのパラメーターにアクセスします。

class BaseClass{
    short color;
    int size;
    String shape;
}

class  Class1 extends BaseClass{
-----Other Class Properties----------   
}

class Class2 extends BaseClass{
-----Other Class Properties----------   
}
于 2012-08-17T12:43:51.907 に答える
0

この問題を解決するには、次の2つのオプションがあります。

  1. 上記のように、デザインを変更します。一部の基本クラス(これらの3つのフィールドを含む)の継承は正常に機能するはずです。
  2. これらの2つのクラス(class1、class2)を変更する方法がない場合=>とにかくフィールド間のマッピングを指定する必要があります。簡単な方法は、コンバーターを使用するオプションです。他のオプションは、annotations / xml/etcでマッピングを定義することです。マッピングツールを使用します。これらの会話にはそれらの良いリストがあります:

Javaオブジェクトからオブジェクトへのマッピングのためのツールはありますか?

ブルドーザーは私にとって最も有望なようです。

于 2012-08-17T13:09:25.197 に答える