我正在写一个
java游戏,我需要一个单元原型的主数据库.数据库只是一个包含HashMap的类,它存储了几十个包含单个单元类型统计信息的类实例.当游戏产生一个新单元时,它会将该单元复制出数据库,使用单元的名称在HashMap中找到它.当程序启动时,此数据库将构建一次,并且不会更改.我也没有扩展或修改存储在HashMap中的任何类.它意味着是游戏系统使用的只读参考.
我有几个其他类,基本上是军队,包含许多单位.当一支军队获得一个单位时,它会将该单位的信息从数据库中复制出来.我有三种方法为军队类提供了一种读取主数据库的方法.我想你的意见是什么是创建一个简单,可读的代码的最佳解决方案,不会产生奇怪的错误.
我已经包含了一些简单的代码来说明不同的方法(对不起,如果我错过了分号或其他东西,我将我的示例快速地放在一起,我还在学习java).
方法1)
我创建数据库作为一个类实例,每次我创建一个新的军队或调用军队方法向军队添加一个单位时,我将军队或方法作为参数传递给数据库实例.这应该很容易想象.
方法2)
我将数据库创建为类实例.在军队类中,我有一个静态引用数据库实例,它由军队类中的静态方法设置一次.在使用数据填充数据库之后,将调用静态方法并将静态引用设置为指向数据库.此后,军队总是能够通过引用静态变量从数据库中提取信息.
class database
{
// HashMap of unit archetypes
private HashMap unitLibrary = new HashMap();
// method for storing units in HashMap
void storeUnits(String fileName)
{
// load unit stats from file
// add new Unit instances to unitLibrary
}
// getter method
Unit getUnit(String unitName)
{
return unitLibrary.get(unitName);
}
}
class Army
{
// variables
private static Database masterDatabase;
private static boolean databaseSet = false;
ArrayList armyUnits = new ArrayList();
// method for creating static database reference
void setReference(Database d)
{
// set static reference to main database if not previously set
if (!databaseSet)
{
masterDatabase = d;
databaseSet = true;
}
}
// add unit to army
void addUnit(String unitName)
{
armyUnits.add(masterDatabase.getUnit(unitName);
}
}
public class CodeTest
{
public static void main(String[] args)
{
// create master database
Database masterDatabase = new Database();
masterDatabase.storeUnits("FileOfUnits.game");
// set static reference in army class to point to master database
Army.setReference(masterDatabase);
// Create army
Army army1 = new Army();
army1.addUnit("Soldier");
}
}
方法3)
我在数据库类中创建HashMap为static,并使用静态方法用数据填充它.数据库类中的getter方法也是静态的.现在根本没有传递引用,因为每次军队类实例需要从数据库中提取时,它只运行Database.getUnit().
class database
{
// HashMap of unit archetypes
private static HashMap unitLibrary = new HashMap();
// method for storing units in HashMap
static void storeUnits(String fileName)
{
// load unit stats from file
// add new Unit instances to unitLibrary
}
// getter method
static Unit getUnit(String unitName)
{
return unitLibrary.get(unitName);
}
}
class Army
{
ArrayList armyUnits = new ArrayList();
// add unit to army
void addUnit(String unitName)
{
armyUnits.add(Database.getUnit(unitName);
}
}
public class CodeTest
{
public static void main(String[] args)
{
// prepare master database
Database.storeUnits();
// create army
Army army2 = new army2();
army2.add("Soldier");
}
}
我已经尝试了所有这三种方法,它们都可以工作,但代码仍处于起步阶段,因为我的早期架构,我不想遇到棘手的错误.我知道它没有以传统的面向对象的方式封装,但是方法3对我来说实际上似乎是最干净的,因为数据库是在后台创建的,并且永远不会通过一堆不同的方法调用来访问.代码也有更少的行,没有像方法2中那样的技巧.
有这样的建议或经验吗?我已经用python做了很多,但我最近才开始学习java,并且仍然试图习惯封装限制.