Java注册表类?

时间:2012-12-15 02:36:26

标签: java php registry

我对Java很新。我来自PHP,我曾经使用magic __get和__set方法在php中创建注册表类。这样系统的其他部分就可以轻松完成:

registry.foo = new Foo();

我应该提到我正在尝试创建游戏引擎。这是我在Java atm的注册表:

class Registry {

    private static Map<String, Object> box = new HashMap<String, Object>();

    public static Object get(String key) {

        if (Registry.box.get(key) != null) {
            return Registry.box.get(key);
        }else {
            return null;
        }
    }

    public static void set(String key, Object o) {
        Registry.box.put(key, o);
    }

}

然后,为了系统的其他部分访问注册表,我目前需要这一切:

((Object) Registry.get("Object")).doSomething();

这真的是很多代码。在php中,这将通过简单地完成:

Registry.foo.doSomething();

有什么方法可以让它更简单一点?我想我可以创建公共字段,但是后来regsitry类需要隐式创建这些字段,因为可能需要添加新对象,这些对象本身是未知的,这是令人讨厌的:P

提前致谢!

3 个答案:

答案 0 :(得分:3)

这是一个双管齐下的问题:

  1. Java是一种静态类型语言,并且不提供在运行时定义对象的语言灵活性(可以使用库在运行时合成类,但是,请参阅#2)
  2. 对象的全局注册表以类型安全的语言击败了许多安全。如果您的整个应用程序围绕获取并将对象放入全局Map,那么可能会有更安全且更少耦合的设计。
  3. 如何解决这个问题?

    1. 重新设计您的应用程序结构,不需要全局地图。
    2. 使用Java的动态语言子集(例如Groovy)。
    3. 使用Scala 2.10(JVM兼容),它具有Dynamic类型,完全符合您的要求。

答案 1 :(得分:1)

  

有什么方法可以让这更简单一点吗?

没有任何实际的方式。 Java是一种静态类型语言,必须事先了解对象的结构。相当于PHP __get__set的想法与语言是对立的。

对于它的价值,无论如何,你的“注册表”看起来都是糟糕的设计。 (不可否认,你从已经显示的小代码中做了一些非常疯狂的假设。)你不应该需要一个看似不相关的对象的全局存储库。你应该考虑某种依赖注入。

根据您的评论,而不是像这样构建您的代码:

class World implements GameSystem {

    public void update() {
        Registry.get("game").doSomething();
    }

}

你应该这样做:

class World implements GameSystem {

    Game game;
    public World(Game game) { // and other dependencies
        this.game = game;
    }

    public void update() {
        this.game.doSomething();
    }

}

我们的想法是,您的程序组件实际上并不知道如何查找其他组件。它还使组件之间的依赖关系显式化,并帮助您避免循环依赖。

答案 2 :(得分:1)

首先,这种方法过于冗长:

public static Object get(String key) {
    if (Registry.box.get(key) != null) {
        return Registry.box.get(key);
    }else {
        return null;
    }
}

可能只是:

public static Object get(String key) {
   return Registry.box.get(key);
}

但其次,这绝对是一个糟糕的设计。全局存储库 - 听起来不合理。通过字符串键存储所有类型的对象 - 这很糟糕。