这有点是一个问题。这是一个视频游戏,我使用libgdx,所以它必须相对较快。
我有一个将被读取和写入derby数据库的对象。其中一些对象数据结构将在运行时定义,因此我不能使用getter和setter制作POJO并使用persistance API。
相反,数据对象将如下所示
import java.sql.Types;
import com.badlogic.gdx.utils.Array;
public class Creature extends PBDBsystem_table
{
protected static Array<PBDBsystem_field> s_field_list = new Array<PBDBsystem_field>();
protected static String s_table_name = new String ("creature");
Creature ()
{
create ( s_table_name, s_field_list );
}
public static boolean init()
{
s_field_list.add ( new PBDBsystem_field ("pk", Types.INTEGER, 0, "", true, true ));
s_field_list.add( new PBDBsystem_field ("name", Types.VARCHAR, 30 ));
s_field_list.add( new PBDBsystem_field ("cost", Types.INTEGER, 0, "1" ));
s_field_list.add( new PBDBsystem_field ("strength", Types.INTEGER ));
create_table ( s_table_name, s_field_list);
return true;
}
}
为了您的信息,全长构造函数定义为:
public PBDBsystem_field ( String name, int type, int size, String default_value, boolean not_null, boolean primary_key )
这基本上做的是init()将在Array中创建一个字段列表,该列表将静态保留在类中,并且通过create()将对表名和字段列表的引用传递给父类。这样每个对象都有一个对它的数据结构的引用(它只被分配一次)。然后父类为每个对象定义数据容器,如下所示:
private ArrayMap<String, String> p_data_list; /** structure to contain database data */
现在我将所有字段都放在字符串中。键是字段名称,值是字段数据。我在父类中使用通用的getter和setter,它们需要一个键,例如:
public void set ( String key, String value)
{
p_data_list.put( key, value);
}
public String get ( String key )
{
return p_data_list.get(key);
}
问题1:建议将所有内容存储为字符串,因为它有时会要求转换为int,这可能会减慢速度。我正在考虑使用例如Interger类而不是基元,并创建一个Object而不是String的数组映射。但我仍然应该得到转换和转换问题,但如果我正确地执行所有通用getter / setter,它们应该保留在父类中。
好的,在创建对象的过程中,我通过反射为表格中的每个字段创建了一个新的字符串实例。
protected void create ( String table_name, Array<PBDBsystem_field> field_list )
{
p_table_name = table_name;
p_field_list = field_list;
p_data_list = new ArrayMap <String, String> ();
p_data_list.ordered = false;
for ( PBDBsystem_field field: p_field_list)
{
p_data_list.put ( field.name, new String() );
}
}
此方法将表名和字段列表引用到父类,然后为每个字段创建一个包含数据的新字符串。但是如果我使用上面的set方法修改字段的内容,它将使用另一个字符串将其插入数组映射中。这导致我
问题2 :它会深入复制到数组映射的字符串中,还是只引用set方法中传递的字符串?这意味着没有理由为每个字段实际实例化字符串。我宁愿把一切都归零。
考虑到它对于视频游戏,我希望通过制作可重用对象或减少无意义的对象破坏来最小化垃圾收集器的使用。