我正在使用谷歌的 CSVReader,它需要一个类名来创建解析器。使用解析器,我将 CSV 文件读入列表。
考虑这段代码:
ValueProcessorProvider provider = new ValueProcessorProvider();
CSVEntryParser<A> entryParser = new AnnotationEntryParser<A>(A.class, provider);
CSVReader<A> newExternalFileCSVReader =
new CSVReaderBuilder<A>(m_NewExternalFile).entryParser((CSVEntryParser<A>) entryParser).strategy(new CSVStrategy(',', '"', '#', true, true)).build();
List<A> m_NewExternalFileData = newExternalFileCSVReader.readAll();
使用这段代码,我可以读取特定于 A 类的 CSV 文件。
我还有其他几个类:B、C、D,它们都使用上面相同的代码,只是它们各自的类。
是否可以有一个函数,我将类名作为字符串传递,它可以根据字符串输入名称实例化 CSVReader/解析器?我不必创建 3 个不同的代码段(针对 B、C、D 类),我可以使用相同的代码段,只需输入相关的类名即可?
最佳答案
您可以使用工厂模式。
创建接口(interface)并在内部定义 A、B、C 和 D 的基本方法。
然后所有 A、B、C 和 D 类都必须实现该接口(interface)。
public interface BaseInterface {
// your methods
}
然后创建一个工厂类,您在其中传递一个标识符,它将返回正确启动的阅读器
package a;
public final class Factory {
// Not instantiable
private Factory() {
throw new AssertionError("Not instantiable");
}
public static CSVReader<your interface> getReader(String reader) {
if ("A".equals(reader)) {
return new CSVReader<A>();
} else if ("B".equals(reader)) {
return new CSVReader<B>();
}
// TODO create all your readers
}
}
现在,您可以像这样通过您的工厂类调用阅读器:
ValueProcessorProvider provider = new ValueProcessorProvider();
CSVEntryParser<A> entryParser = new AnnotationEntryParser<A>(A.class, provider);
CSVReader<your interface> newExternalFileCSVReader =
Factory("your reader type");
List<your interface> m_NewExternalFileData = newExternalFileCSVReader.readAll();
由于您没有发布 A、B、C 和 D 类,您必须自定义该代码,但按照这种方式,我认为您可以完成您想要的。
关于java - 使用字符串类名实例化通用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33934952/