我正在尝试在 Java 中实现一个接口,以便为一个应用程序使用不同类型的数据库。我的想法是创建一个具有公共接口和两个静态变量的抽象类,然后被子类覆盖。然后我想添加一个 Class[] 列表,其中包含所有可用子类的类到抽象类以及允许确定要使用的正确类的几个函数。
目标是首先获取所有可用数据库类型的列表并让用户选择一个。之后,另一个函数应该将名称(可以本地化)转换为IDENTIFIER
子类中指定的名称。最后,第三个函数允许通过给出这样的IDENTIFIER
.
我的抽象类看起来像这样:
public abstract class DataBase {
public static final IDENTIFIER = "";
public static final NAME = "";
private static final Class[] dbTypes = new Class[]{PostgreSQL.class, MySQL.class};
public static String[] getNameList() {
String[] names = new String[dbTypes.length];
for(int i = 0; i < dbTypes.length; i++){
names[i] = dbTypes[i].NAME; //Cannot access the static variable this way.
}
return names;
}
public static String getIdentifierForName(String name) {
for(int i = 0; i < dbTypes.length; i++){
if(name.equals(dbTypes[i].NAME){
return dbTypes[i].IDENTIFIER;
}
}
return "";
}
public static DataBase getInstanceOf(String identifier) {
for(int i = 0; i < dbTypes.length; i++){
if(identifier.equals(dbTypes[i].IDENTIFIER) {
return dbTypes[i].newInstance();
}
}
return null;
}
}
Child 类看起来像这样:
public class MySQL extends DataBase {
public static final IDENTIFIER = "ab.cde.MySQL";
public static final NAME = "MySQL";
...
}
public class PostgreSQL extends DataBase{
public static final IDENTIFIER = "ab.cde.PostgreSQL";
public static final NAME = "PostgreSQL";
...
}
我现在的问题是,我无法从 Class 对象访问静态变量。显然 dbTypes 列表不包含任何类型化的类。我尝试将 Array 的类型更改为Class<? extends DataBase>
,但出现错误Cannot create a generic array of Class<? extends DataBase>
我还尝试使用检查类isAssignableFrom()
然后强制转换类,但我仍然无法访问静态变量。
现在我有两个有效的解决方案:
将所有现有的子类硬编码到每个函数
if(PostgreSQL.NAME.equals(name)){...}
等中。但是,如果我添加新的子类,我只想在我的实现中添加它们。除了使用 Class[] 数组,我可以使用 DataBase[] 数组和每个类的实例。但是,我认为实例化每个可用的 DataBase 子类是一种不好的做法,即使我最终只需要一个。
因为我之前从未做过这样的事情,所以我也可能完全错误地处理这个问题。也许我错过了通常完成此类事情的正确方法?
感谢您的帮助。