Java - Общий класс, расширенный конкретным классом
У меня есть несколько классов, стиль POJO, которые разделяют одну функциональность, скажем, метод readCSV. Поэтому я хочу использовать один родительский (или, может быть, абстрактный, не уверенный, должен ли) класс, который могут расширять эти POJO. Вот псевдокод:
(abstract) class CSVUtil {
private String[] fileHeader = null;
protected void setFileHeader(fileHeader) {
this.fileHeader = fileHeader;
}
protected List<WhateverChildClass> readCSV(String fileName) {
// read CSV using Apache Commons CSV
// and return a List of child type
List<WhateverChildClass> list = null;
// some declarations
try {
list = new ArrayList<WhateverChildClass>();
csvParser = new CSVParser(fileReader, csvFormat);
List csvRecords = csvParser.getRecords();
for (...) {
CSVRecord record = (CSVRecord) csvRecords.get(i);
WhateverChildClass childClass = new WhateverChildClass();
// loop through fields of childClass using reflection and assign
for (// all fields of childClass) {
childClass.setWhateverField(record.get(fileHeader[i]));
}
list.add(childClass);
System.out.println(p);
ps.add(p);
}
}
...
return list;
}
}
на одном из детских классов, скажем, ChildA
class ChildA extends CSVUtil {
// fields, getters, setters
}
Как мне кодировать CSVUtil так, чтобы я мог определить во время выполнения дочерний класс в readCSV, определенный в родительском классе?
Можно ли сделать этот метод статичным и все же наследоваться?
В качестве альтернативы, есть ли в Apache Commons CSV API, который обычно может читать CSV, определять его схему и оборачивать его как универсальный объект (я не знаю, имею ли я здесь смысл) и возвращать список того или иного объекта является?
1 ответ
Вы хотите, чтобы readCSV был статическим методом?
Тогда я бы сказал, что класс ChildA не должен наследоваться от CSVUtil, но должен реализовывать интерфейс... что-то вроде этого:
public final class CSVUtil {
private CSVUtil() {
}
public static <T extends ICSV> List<T> readCSV(String filename) {
...
}
class ChildA implements ICSV