全球可访问的对象?

时间:2012-08-09 00:14:03

标签: java global-variables

我正在制作一个小型RPG游戏,并为对象之间的事件驱动通信实现了一种观察者设计模式。我有一个EventManager,它注册监听器,接受新事件,并调度事件。问题是需要发送或接收事件的每个对象都需要EventManager实例来调用addEvent()或register()。由于我程序中的几乎每个对象都将使用该系统(为了减少耦合并避免数据修改错误),我需要一种很好的方法来访问它。

目前我将引用明确地传递给构造函数和方法中的大量对象,但随着规模的增加,这变得更加混乱。特别是因为我开始在像Character这样的对象中需要它,并且角色不是在游戏中构造的;它们是从数据文件中反序列化的。

我知道全局变量一般都是糟糕的设计,但这些是我能看到的选项,所有这些都受到批评:

a)使EventManager中的每个字段和方法都是静态的

b)采用单件设计

c)创建一个公共静态EventManager

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:2)

实际上,您目前所做的是最佳做法。依赖注入非常重要,不仅适用于模块化,也适用于测试。您可以通过使用工厂来减轻传递参数的负担。

如果你要使用全局变量(你不应该这样做),那么在Java中这样做的方法就是某些类的静态公共字段。

答案 1 :(得分:0)

我会亲自推荐静电。静态和单身之间的巨大差异。我是注入的粉丝,但不是那么接受依赖的类然后可以传递它。只是我自己的想法。

答案 2 :(得分:0)

依赖注入框架(Google Guice)提供了一种管理大型应用程序引用的好方法。除了允许您更改应用程序之外,这样做的好处是可以让您更专注于使用对象的方式,而不是如何获得对它们的引用(假设您想要2个事件管理器或每个玩家一个) )仅通过更新相关的出口模块。

它还允许通过将类与其依赖项分离来更容易地进行单元测试(如果你有一个单例事件管理器,那么使用mock framework测试每个类而不必构造整个对象会更加困难等级。