在创建将在多个级别频繁引用的java对象时,使用类实例或使类静态
我正在写一个
java游戏,我需要一个单元原型的主数据库.数据库只是一个包含HashMap的类,它存储了几十个包含单个单元类型统计信息的类实例.当游戏产生一个新单元时,它会将该单元复制出数据库,使用单元的名称在HashMap中找到它.当程序启动时,此数据库将构建一次,并且不会更改.我也没有扩展或修改存储在HashMap中的任何类.它意味着是游戏系统使用的只读参考.
我有几个其他类,基本上是军队,包含许多单位.当一支军队获得一个单位时,它会将该单位的信息从数据库中复制出来.我有三种方法为军队类提供了一种读取主数据库的方法.我想你的意见是什么是创建一个简单,可读的代码的最佳解决方案,不会产生奇怪的错误. 我已经包含了一些简单的代码来说明不同的方法(对不起,如果我错过了分号或其他东西,我将我的示例快速地放在一起,我还在学习java). 方法1) 方法2) class database { // HashMap of unit archetypes private HashMap<String,Unit> unitLibrary = new HashMap<String,Unit>(); // 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<Unit> armyUnits = new ArrayList<Unit>(); // 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) class database { // HashMap of unit archetypes private static HashMap<String,Unit>(); // 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<Unit> armyUnits = new ArrayList<Unit>(); // 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,并且仍然试图习惯封装限制. 解决方法
方法1是最好的.
这对我来说似乎是问题的症结所在.你试图用静态变量解决dependency injection,这是一个糟糕的主意.如果您认为这是一个问题,像Spring这样的框架可以为您节省使用autowiring等功能传递对象的麻烦. 如果,在你的第二个例子中,我创建了一支军队并忘记设置数据库怎么办?我有一个有效处于半创建状态的对象.对象永远不应该处于这种状态.如果你需要将它传递给构造函数,那么你就可以避免这个潜在的bug. 您的第二个和第三个示例存在维护问题,因为当您不知道您的需求可能会如何变化时,它们会将您限制为单个实例.你怎么知道两个不同的军队将永远共享一个数据库?如果将来你想要一个ModernUSArmy和一个AncientMacedonianArmy怎么办?你知道他们会分享相同的原型吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |