我对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
提前致谢!
答案 0 :(得分:3)
这是一个双管齐下的问题:
Map
,那么可能会有更安全且更少耦合的设计。 如何解决这个问题?
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);
}
但其次,这绝对是一个糟糕的设计。全局存储库 - 听起来不合理。通过字符串键存储所有类型的对象 - 这很糟糕。