java需要频繁创建大对象_在创建将在多个级别频繁引用的java对象时,使用类实例或使类静态更好吗?...

我正在写一个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,并且仍然试图习惯封装限制.

解决方法:

方法1是最好的.

but Method 3 actually seems the cleanest to me because the database

gets created in the background and never has be piped through a bunch

of different method calls to be accessed

这对我来说似乎是问题的症结所在.你试图用静态变量解决dependency injection,这是一个糟糕的主意.如果您认为这是一个问题,像Spring这样的框架可以为您节省使用autowiring等功能传递对象的麻烦.

如果,在你的第二个例子中,我创建了一支军队并忘记设置数据库怎么办?我有一个有效处于半创建状态的对象.对象永远不应该处于这种状态.如果你需要将它传递给构造函数,那么你就可以避免这个潜在的bug.

您的第二个和第三个示例存在维护问题,因为当您不知道您的需求可能会如何变化时,它们会将您限制为单个实例.你怎么知道两个不同的军队将永远共享一个数据库?如果将来你想要一个ModernUSArmy和一个AncientMacedonianArmy怎么办?你知道他们会分享相同的原型吗?

标签:java,encapsulation,static-methods

来源: https://codeday.me/bug/20190731/1586487.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值