存储游戏对象常量而没有巨大的"常数"类

时间:2016-12-24 08:51:32

标签: java

基本上,我的问题与this一样,除了我必须在非常特定的时间点对每个常量执行代码。

更具体地说,我试图让我的游戏插件更多地遵循面向对象和良好的设计原则和标准。以前,我们有包含游戏对象常量的巨型类,使用巨大的静态register方法(例如registerFirearmsregisterArmor)将这些对象注册到相应的注册表中,然后将它们分配给它们全局常数。

例如:

public class Items {
    public static Item firearm;

    public static void register() {
        registerFirearms();
    }

    public static void registerFirearms() {
        firearm = new FirearmItem();
        Registry.register(firearm);
    }
}

在游戏加载过程中的适当时间,Items.register();将被调用,并且该类中的所有值都可以在整个插件中使用。

我只是不确定如何在没有一些可怕的无法维护的数千行类的情况下存储这些对象实例。

2 个答案:

答案 0 :(得分:1)

似乎每个项目最终都需要在注册表中注册。因此,一长串的东西在某种程度上是不可避免的。因此,我认为您不一定要查看代码组织问题。在我看来,这是一个问题:没有足够的数据管理工具来处理数据。

如果可能的话,我建议管理java代码之外的数据,探索像SQLite这样的选项。通过这种方式,您可以配置数据库以使项目数据维护成为一个更有效的过程。然后更改您的java代码,以便通过将查询结果迭代到数据库来注册项目。这应该使您的数据更易于管理,并使您的Java代码更简洁。

答案 1 :(得分:0)

如何将所有项目存储到配置文件(甚至更好的XML)中,然后让Items.register();读取文件并初始化所有项目?

我会做像

这样的事情
public class Item {
    public Item(String type /* any other thing about the item*/ ) {
        // do your stuff...
    }
}

public interface ItemCollection {
    public void register() throws YourProjectException;
}

public interface ItemSet implements ItemCollection {
    private final java.util.Set<Item> items;

    public void register() throws YourProjectException {
        try {
            // open the file
            // read each item and store it in "i"
            items.add(i); // you must override the equals method if you want each item to be added just once...
            // close the file 
        } catch(Exception ex) { // even better if you manage each exception separately
            // manage the exception 
            throw new YourProjectException();
        }
    }
}