0

BeanUtils.populate メソッドを使用して String[] から ArrayList に変換するにはどうすればよいですか? ArrayConverter クラスを使用できるように見えますが、その方法についての説明を見つけるのに苦労しています。

ここに私が作成したいくつかのテストコードがあります:

public class TestAction {
public static TestBean testPopulate() throws IllegalAccessException, InvocationTargetException {
    HashMap<String, Object> map = new HashMap<String, Object>();
    TestBean bean = new TestBean();
    String[] names = {"teststring","testboolean","testinteger","testarray"};
    String[] array = {"hi","bye"};
    Object[] values = {"TEST","","100",array};
    int i = 0;
    while (i < names.length) {
        String name = names[i];
        map.put(name, values[i]);
        i++;
    }
    BeanUtils.populate(bean, map);

    return bean;
}

public static void main(String[] args) {
    try {
        TestBean bean = testPopulate();
        System.out.println(bean.getTeststring() + " " + bean.getTestinteger() + " " + bean.getTeststring() + " " + bean.isTestboolean());
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

public class TestBean {
private String teststring;
private boolean testboolean;
private int testinteger;
private ArrayList<String> testarray;

public String getTeststring() {
    return teststring;
}
public void setTeststring(String teststring) {
    this.teststring = teststring;
}
public boolean isTestboolean() {
    return testboolean;
}
public void setTestboolean(boolean testboolean) {
    this.testboolean = testboolean;
}
public int getTestinteger() {
    return testinteger;
}
public void setTestinteger(int testinteger) {
    this.testinteger = testinteger;
}
public ArrayList<String> getTestarray() {
    return testarray;
}
public void setTestarray(ArrayList<String> testarray) {
    this.testarray = testarray;
}

}

ArrayList への変換方法を知っていることを期待して String[] 型を渡しますが、失敗します。

4

2 に答える 2

2

私は一般的にBeansを扱っていないため、これは一般的な回答です。BeanUtilsこのケースを処理する可能性はありますが、私には驚きです。

文字列の配列は、似ているにもかかわらず、ArrayList オブジェクトと同じではありません。実行できる論理的な方法が複数あるため、一方から他方に暗黙的に変換することは、一般的にはお勧めできません。

  • which を使用して、配列を取り、ラッパーオブジェクトArrays.asList()を返すことができます。ではなく、渡された配列と直接やり取りする固定サイズのカスタム実装であるListことに注意してください。つまり、新しいストレージを割り当てる必要はありません。ArrayListList

  • 代わりに本当に が必要な場合は、取得したオブジェクトにArrayList基づいて新しいものを構築できます。List

    ArrayList<String> ls = new ArrayList<String>(Arrays.asList(myArray));
    

    この呼び出し新しいストレージ配列を割り当てますが、調整可能なサイズが必要な場合は、その O(n) コストを受け入れる必要があります。

これらの 2 つの可能な選択肢は、どちらもユース ケースに応じて等しく有効ですが、Bean が暗黙的に配列を に変換するのが適切ではない理由はまさにそのためListです。どちらの実装を選択する必要がありますか? サイズを変更しようとすると例外をスローする高速なものか、そうでない低速のものか?

可能な限り、型変換について明示してください。冗長に見える/不快に見えるにもかかわらず、これは Java の最も強力な機能の 1 つです。

于 2013-03-23T22:32:17.120 に答える
1

コードで正確に何が失敗するかについては言及していませんが、サードパーティのユーティリティを使用せずに文字列配列をリストに変換する方法は次のとおりです。

Arrays.asList(new String[] {"aaa", "bbb", "ccc"})

于 2013-03-23T22:28:23.617 に答える