私は、Javaのリフレクション(将来的にジェネリック医薬品の使用を意図しています)に基づいてSQLジェネレータをコーディングしています。私は(挿入および更新操作のための)テーブル名、フィールドとフィールド値を生成するためのオブジェクトをパラメータとして受け取り、私のDAOのクラスで私は、コードのどこにも使用されることはありません新しい空のオブジェクトを、インスタンス化しています、ちょうどこれらの情報を取得します。この目的を果たすために、メモリ空間を占有しません「ゴースト」オブジェクトのいくつかの並べ替えをキャストする方法はありますか?
これは、SQLの生成を担当するクラスです。
public abstract class DynamicSQL
{
public static final boolean NO_ID = false;
public static final boolean WITH_ID = true;
private Vector<Field> get_class_fields(Object obj, id_wanted)
{
Class<?> cls = obj.getClass();
Vector<Field> fields = new Vector<>();
while(cls != Object.class)
{
Field[] cls_flds = cls.getDeclaredFields();
fields.addAll(Arrays.asList(cls_flds));
cls = cls.getSuperclass();
}
// If the id is not wanted, it is removed here
if(!id_wanted)
{
for(int i = 0; i < fields.size(); i += 1)
{
Field f = fields.get(i);
if(f.getName().equals("id"))
fields.remove(f);
}
}
return fields;
}
private Vector<String> get_fields_names(Object obj, boolean id)
{
Vector<Field> fields = get_class_fields(obj, id);
Vector<String> field_names = new Vector<>();
for(Field f : fields)
{
field_names.add(f.getName());
}
return field_names;
}
private String get_table_name(Object obj)
{
String[] class_name = obj.getClass().getName().toLowerCase().split("\\.");
String table_name = class_name[class_name.length - 1];
return table_name;
}
protected String select_sql(Object obj)
{
String table_name = get_table_name(obj);
Vector<String> fields = get_fields_names(obj, WITH_ID);
String sql = "SELECT ";
for(int i = 0; i < fields.size(); i += 1)
{
sql += fields.get(i);
if(i < fields.size()-1) sql += ", ";
}
sql += " FROM " + table_name;
return sql;
}
//work in progress...
}
これは私のDAOクラスであります:
public class CustomerDAO extends DynamicSQL implements IDAO<Customer>
{
@Override
public Vector<Customer> list_all()
{
Vector<Customer> customers = new Vector<>();
//Here I instantiate the object I'm willing to get rid of
String sql = select_sql(new Customer.Builder().build(), DynamicSQL.WITH_ID);
try
{
ResultSet rs = ConnectionFactory.get_instance().execute_query(sql);
while(rs.next())
{
customers.add(new Cliente.Builder().
id(rs.getLong("id")).
nome(rs.getString("nome")).
endereco(rs.getString("endereco")).
telefone(rs.getString("telefone")).
build()
);
}
}
catch(SQLException e)
{
e.printStackTrace();
}
return customers;
}
//other method overrides and implementation...
}
すべてが正常に動作しますが、私は不必要なオブジェクトのインスタンス化とイライラしています。それを行うにはそこに別の方法がある、または私はとにかく、そのオブジェクトをインスタンス化する必要がありますか?
Javaでは、あなたは直接オブジェクトにアクセスすることはできません。あなたが持っていることであるオブジェクト参照オブジェクトを参照することができます(CまたはC ++でのポインタのように)。したがって、異なるクラスおよびメソッドは、同じオブジェクト(TOポイント)を参照して、異なるオブジェクト参照を使用して、オブジェクトを共有することができます。いくつかのクラス(またはメソッド)の共有オブジェクトではなく、それぞれが自分の唯一の使用のための新しいオブジェクトを作成する場合、追加の空間が第二及びその後の使用のために使用されません。あなたが作成することはできませんが、だから、ゴーストオブジェクトを、あなたは、オブジェクトを共有することによって同等の何かを行うことができます。オブジェクトがある場合、これは最高の作品不変。
この方法は、(あなたのメソッドのためのケースのように思われる)たびに、同等の不変オブジェクトを使用している場合は、するオブジェクトを変更することにより、オブジェクト作成のコストを節約することができstatic
、オブジェクト、そのクラスがロードされるときにオブジェクトが作成され、後続のすべてのメソッドの実行のために共有していました。
これは何であるCollections.emptyList()
方法はありません。
このメソッドの実装では、呼び出しごとに個別のListオブジェクトを作成する必要はありません。