java - 模拟中时间管理的静态类

标签 java static-classes

我正在尝试使用 OOP(准确地说是 SC2)用 Java 编写游戏模拟器。基本上,游戏有单位(每个不同的单位是一个类,每个实际创建的单位是该类的实例),并且具有具有不同角色的建筑物。同样,每个建筑物都有自己的类,并且当建筑物被 build 时,其类被实例化。所以我会有 u1、u2、u3、b1、b2 b3...等实例。

一切都很好。

现在,我需要模拟时间增量。我知道最终我需要用户能够与游戏进行交互(例如,在关键时刻,这取决于游戏并且在模拟之前不知道,我需要用户输入)。这意味着我希望游戏运行 X 时间增量,然后可能因特定事件而停止(当获得 Y 资源时,这允许创建建筑物/单元,或者当创建新建筑物并打开新的建筑物时)决定)。

总结一下我的(一般)类(class):

class Unit extends GameElement{
  //bunch of attributes
  //bunch of units-specific methods, getters & not relevent here

   public void timeIncrement () {
     //Manages all time-dependant changes for this unit when
     //that method is called
    }
        }

与构建类似,它们将有自己的 timeIncrement 方法,该方法将管理它们自己的(特定于类的)时间相关行为。

建筑类和单元类都是以下内容的扩展:

abstract class GameElement {

//Manages time-dependant behaviours
public abstract void timeIncrement();

//Manages the building/creation of the game element
public abstract void building();
}

定义了所需的常用方法,例如每个单元都必须管理好自己的时间和建筑程序。

我对如何定义有疑问

class TimeManagement{
    //Those ArrayList list all objects created with a 
    //timeIncrement() method that needs to be called
    private ArrayList<Units> = new ArrayList<Units>();
    private ArrayList<Buildings> = new ArrayList<Buildings>();
    //This is the (universal game-wide) timestep. It might change so I
    //need to have a single-place to edit it, e.g. global variable
    private double TIME_STEP = 0.5;

}

基本上,我的计划是使用 TimeManagement 和 ArrayList 来存储它需要告诉时间已增加的所有对象。对于每个 arrayList,它将循环遍历它包含的对象并调用 myObject.timeIncrement() 方法,然后对象将按照编程方式管理增量。

我的问题是如何定义这个 TimeManagement 类。实例化这个类对我来说没有意义。但是如果我声明它是静态的,我就不能(除非我在这方面错了 - 我还没有使用太多静态类)在构建新单元时更新它的 ArrayList,那么 TimeManagement 如何能够为所有单元调用 timeIncrement需要它的对象?

或者我应该创建一个 TimeManagement 的虚假实例,这样我就不必将其声明为静态?但从编程的角度来看,这感觉是错误的。

我更愿意用这个通用架构来解决一些问题。在我看来,它需要类似于这个 TimeManagement 类的东西,但我似乎不太明白......

最佳答案

快捷方式

您可以简单地将所有字段设为静态:

class TimeManagement {
    private static List<Unit> = new ArrayList<Unit>();
    private static List<Building> = new ArrayList<Building>();

    private static final double TIME_STEP = 0.5;
}

这样,您就需要始终静态地引用 TimeManagement

使用单例模式

但是,在这种情况下,我宁愿使用单例:

class TimeManagement {
    private static final double TIME_STEP = 0.5;
    
    private List<Unit> = new ArrayList<Unit>();
    private List<Building> = new ArrayList<Building>();

    private TimeManagement instance;

    public static TimeManagement getInstance() {
        if (instance == null) {
            instance = new TimeManagement();
        }
        return instance;
    }
}

这样,您就可以通过调用 #getInstance() 方法来获取一个现有实例。对代码的进一步说明:我将 TIME_STEP 变量保持为静态,至于常量,这是有意义的,因为它们本质上绑定(bind)到类,而不是特定实例。

关于java - 模拟中时间管理的静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28678431/

相关文章:

java - 从文件到 HTML 服务器端的内联 JS

c# - 为什么不能为静态类创建扩展方法?

ASP.NET 静态类和 asp.net session

c# - 重构静态类以与依赖注入(inject)一起使用

c# - 枚举和使用带有常量的静态类有什么区别?

java - 基于 Java 日期在 Postgres 中保存时间戳

java - tomcat上的 "remote debugging"是什么?

java - 从 Set 中获取元素

Java 类解析器

c# - c# 中 Dictionary<string, string> 的静态类