Java でインターフェイスを実装して、1 つのアプリケーションでさまざまな種類のデータベースを使用しようとしています。私が考えたのは、共通のインターフェイスと 2 つの静的変数を使用して抽象クラスを作成し、それらをサブクラスによって上書きすることでした。次に、使用可能なすべてのサブクラスのクラスを含む Class[] List を抽象クラスに追加し、使用する正しいクラスを決定できるいくつかの関数を追加したいと考えました。
目標は、まず利用可能なすべてのデータベース タイプのリストを取得し、ユーザーに 1 つを選択させることです。その後、別の関数が名前 (ローカライズ可能) をIDENTIFIER
サブクラスで指定された に変換する必要があります。最後に、3 番目の関数は、そのような を与えることにより、オブジェクトのインスタンス化を可能にします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()
今のところ、機能している2つのソリューションがあります。
既存のすべてのサブクラスを各関数
if(PostgreSQL.NAME.equals(name)){...}
などにハードコードします。ただし、新しいサブクラスを追加する場合は、実装の 1 時点で追加するだけで済みます。Class[] 配列を使用する代わりに、各クラスのインスタンスで DataBase[] の配列を使用できます。ただし、最終的に必要なのは 1 つだけですが、使用可能な各 DataBase サブクラスをインスタンス化するのは悪い習慣だと思います。
私はそのようなことをしたことがないので、問題に完全に間違ったアプローチをしている可能性もあります。たぶん、このようなことが通常行われる正しい方法を見逃していますか?
ご協力ありがとうございました。