【发布时间】:2018-05-15 15:26:55
【问题描述】:
我有一个方法实例化一个特定的类,具体取决于类型发送作为该方法的参数。这工作得很好,但我真的不喜欢if(c == class_name.class) 处理这个问题的方式,我很确定使用泛型和继承有更好的方法来做到这一点。我使用的方法看起来(可能是错误的......)对我来说很脏。
我遵循了几个关于泛型和继承的教程,但即使我认为我或多或少地分别理解这两个概念,我也在努力理解两者的混合......而且我认为这两个概念一旦混合就可以解决我的问题。任何人都可以告诉我正确的轨道,泛型,继承,或者让我的代码保持这样。有没有更好的方法来做到这一点?
这是我的实际方法:
private void addData(String csvFile, char separator, Class<?> c) {
int lineNumber = 1;
CSVReader reader;
try {
reader = new CSVReader(new InputStreamReader(getAssets().open(csvFile)), separator);
String[] line;
realm.beginTransaction();
if(c == FlagDef.class) {
while ((line = reader.readNext()) != null) {
FlagDef flagDef = new FlagDef(Long.parseLong(line[0]), line[1], line[2]);
Log.d(TAG, String.format("%s %s %s", line[0], line[1], line[2]));
realm.copyToRealm(flagDef);
lineNumber++;
}
}
if(c == Picture.class) {
while ((line = reader.readNext()) != null) {
Picture picture = new Picture(Long.parseLong(line[0]), line[1]);
Log.d(TAG, String.format("%s %s", line[0], line[1]));
realm.copyToRealm(picture);
lineNumber++;
}
}
realm.commitTransaction();
reader.close();
} catch (FileNotFoundException ex) {
Log.e(TAG, String.format("File %s not found : %s", csvFile, ex));
} catch (IOException ex) {
Log.e(TAG, String.format("Error parsing line number %s : %s", lineNumber, ex));
}
}
对该方法的调用:
addData(FILE_FLAGS,SEPARATOR,FlagDef.class);
addData(FILE_PICTURES,SEPARATOR,Picture.class);
copyToRealm方法的声明可见here
这是针对 Android 的,我实际上是针对 API 16。
为了简洁起见,我在这里只指出Picture 和FlagDef 两种类型,但我计划至少有10 种不同的类型。
【问题讨论】:
-
这听起来不可能,你的类型(类)在运行时是已知的,那时没有类型
T(或任何你有的泛型)。传递Class<T>在这里似乎是正确的,对我来说一点也不脏 -
在您的情况下,我认为没有其他解决方案可以避免
if(c == class_name.class),因为您无法使用 CSV 文件确定对象的类型。但是,您的问题看起来像 Strategy Design Pattern IMO 问题。 -
调用addData时如何获取
c的值? -
@StephaneM 我刚刚编辑了我的问题。这里的上下文是我只有几个 csv 文件,其中包含需要放入 Realm 数据库的数据。所以我知道要发送哪个类作为参数,因为每个文件对应于映射到我的 Realm 数据库对象的特定类。
-
泛型在这里帮不了你。它们是仅编译时的构造。
标签: java android generics inheritance