2016-03-26 30 views
0

Ben String parametresini kabul eden ve genel ile nesneyi dönüştüren bir Yardımcı Program yöntemi uyguluyorum. Aşağıdaki kodla ancak zayıf noktası zayıf noktası , ayrıştırması gereken her nesnenin bir dize yapıcısına sahip olması gerekir. Nesnenin String kurucusuna sahip olması gerektiğini tanımlamanın bir yolu yoktur. Bunu polimorfizm veya jenerik kullanarak gerçekleştirmenin başka bir yolu var mı?Dizgeyi Nesne dönüştürmek için genel yolu

AAA.java

public class AAA { 
    private String id; 
    private String description; 

    public AAA(String str) { 
     // Do parsing... 
    } 

Yardımcı yöntemi.

public static <T extends Base> List<T> readFile(File file, Class<T> type) { 
    List<T> collection = new ArrayList<T>(); 
    // Read file line by line and convert to Instance 

    Constructor<T> ctor = type.getConstructor(String.class); 
    T newInstance = ctor.newInstance(line); 
    if (newInstance != null) { 
     collection.add(newInstance); 
    } 
    return collection; 
} 

Kullanımı:

List<AAA> list = FileUtil.readFile(file, AAA.class); 
+0

Dize hangi biçimde? Ya da senin dosyan. CSV virgülle ayrılmış veya JSON'da mı yoksa böyle bir şey mi? –

+0

Dizenin formatına karar verebilecek olan siz misiniz? –

+0

@DanielvanHeerden bu bir CSV'dir. – swemon

cevap

0

Ben senin POJO sınıfları (aslında veri içeren bir) Eğer örnekte var formatında genellikle varsayılmaktadır. Tüm alanların anlamı String değerleridir. Eğer durum böyle değilse, çözümümün biraz arıtılması gerekiyor.

Benim önerim, açıkladığınız kullanım durumu için yansıma kullanmaktır. Geçmişte bu konuda çok başarılı oldum. Her ne kadar yansıma kötü uygulandığında ciddi performans cezaları oluşturabilir. Ayrıştırma kodu aşağıdakine benzer görünebilir. Sağladığınız ürün zaten iyi göründüğünden beri bir metod başlığı atlamıyorum. Sağladığım kod, değişkeninde line değişkeninin CSV dosyanızın zaten ayrıştırılmış bir satırını bulduğumuzu varsayar. Dizinin her elemanı CSV hattının bir sütununu içerir.

String[] line; // initialised as explained above 
T newInstance = T.newInstance(); // invoke default constructor 
Field[] fields = newInstance.getClass().getDeclaredFields(); // use reflection to read all fields 
int count = 0; 
for(Fields f : fields) { 
    f.set(newInstance, line[count]); 
    count++; 
} 

Yasal Uyarı: Yukarıdaki kod hiçbir sınır denetimi gerçekleştirmiyor! Varsayım, CSV çizgilerinin ve bir sınıftaki alanların sayısının aynı uzunluğa sahip olmasıdır!

Field nesnelerinde genellikle yaptığım şey, belirli bir ek açıklamanın alana ayarlanıp ayarlanmadığını kontrol etmek için getAnnotation numaralı telefonu da aramaktır. Bu böyle sınıfları yazmasına olanak tanır:

public class AAAAnnotated { 

    @MyCSVAnnotation 
    String field1; 

    @MyCSVAnnotation 
    String field2; 

    String field3; 
} 

Eğer alanlar bile bakir bırakmak formu CSV yüklemek için alanlar ve POJO sınıflarında kontrol edebilirsiniz ek açıklamalarla açıklamalı olsun ya da olmasın kod denetler.

İlgili konular