0 امتیاز
قبل در برنامه نویسی توسط (52 امتیاز)
برچسب گذاری دوباره قبل توسط

چگونه میتوان برنامه ای نوشت که به عنوان ورودی لیستی از یک آبجکت نامعلوم (جنریک) بگیرد و درون آن برنامه ضمن پیمایش لیست به فیلدها (پروپرتی ها) آن آبجکت دسترسی داشت؟

هدف از انجام این کار این است که رویه ای به عنوان makeExcell وجود داشته باشد که ورودی آن یک لیست از هر آبجکتی باشد و خروجی آن فایل اکسل که در هر سطر آن یکی از اعضای لیست و در ستون های آن پروپرتی های آبجکت باشند.

اگر از هر دو روش جنریک و رفلکشن میشود بفرمایید کدام یک بهینه تر است.

1 پاسخ

+1 امتیاز
قبل توسط (1.1هزار امتیاز)
ویرایش شده قبل توسط

مواردی که کد تکراری زیاد است بهتر است از reflection استفاده شود، برای مورد شما می توانیم با generic متد ها و همچنین یک interface مشترک به نتیجه رسید:

public interface Exportable {
    String export();
}

/////////////////////////////////////////////////////

public class AClass implements Exportable {
    public String state;
    public int num;

    public AClass(String state, int num) {
        this.state = state;
        this.num = num;
    }

    @Override
    public String export() {
        return state+","+num;
    }
}

/////////////////////////////////////////////////////

    public static void main(String[] args) throws IOException {

        List<AClass> list = new ArrayList<>();
        list.add(new AClass("a", 1));
        list.add(new AClass("b", 2));
        list.add(new AClass("c", 3));

        new Main().makeExcel(list);

    }

    public <T> void makeExcel(List<T> list){
        for (T t: list){
            if (t instanceof Exportable) {
                System.out.println(((Exportable) t).export());
            }
        }
    }

با استفاده از reflection هم متد makeExcel بصورت زیر در می آید:

    public <T> void makeExcel(List<T> list) throws IllegalAccessException {
        for (T t : list) {

            StringBuilder sb = new StringBuilder();
            sb.append(t.getClass().getName());
            sb.append(": ");
            for (Field f : t.getClass().getDeclaredFields()) {
                sb.append(f.getName());
                sb.append("=");
                sb.append(f.get(t));
                sb.append(", ");
            }

            System.out.println(sb.toString());
        }
    }

سوالات مشابه

0 امتیاز
1 پاسخ 551 بازدید
0 امتیاز
2 پاسخ 1.9هزار بازدید
+1 امتیاز
1 پاسخ 1.3هزار بازدید
0 امتیاز
1 پاسخ 541 بازدید
+2 امتیاز
2 پاسخ 5.2هزار بازدید
سوال شده 11 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
1 پاسخ 737 بازدید
+1 امتیاز
2 پاسخ 1.1هزار بازدید
+1 امتیاز
2 پاسخ 2.2هزار بازدید
سوال شده 9 سال قبل در برنامه نویسی توسط sara_sheikhi (20 امتیاز)
+1 امتیاز
1 پاسخ 1.1هزار بازدید
...