在构建软件时,我经常发现我需要提供很多实例,以便他们可以引用彼此的非静态成员。我可以创建一个类(在Java中),而不是传递大量的对象,如下所示:
public class Handler {
private HashMap<String, Object> map = new HashMap<>();
public void put(String key, Object value) {
map.put(key, value);
}
public Object get(String key, Object value) {
return map.get(key);
}
}
然后你可以传递这个类并让每个使用它的对象将它们添加到处理程序中,这样你就可以很容易地在实例之间共享东西。您甚至可以创建此类的“静态”版本并添加常用的变量,例如屏幕尺寸。
我觉得在软件设计层面上使用上述内容相当糟糕。这有什么“错误”吗?
答案 0 :(得分:2)
您描述的方法存在的问题是您无法强制执行和/或保证给定密钥具有特定类型的值。这意味着你需要做一些对象的渲染才能让它们回来(并希望铸造不会失败......)
如果您需要共享项目,请考虑为每个对象类型设置一个存储库。然后,您可以在此存储库中查询项目,并且您可以根据需要对其进行修改。
请记住,这可能会导致并发问题,因此请相应地构建存储库。
答案 1 :(得分:1)
它的主要问题是您丢失了类型信息:您不知道Handler
的任何给定实例是否具有给定密钥,并且您不知道相关的值是否与密钥属于给定类型。
这不一定是个问题 - 您只需付出更多努力来确保将正确的东西放入其中,并验证您是否得到了您期望的东西。
最好为每个目的定义一个自定义类,并使用具有语义意义的字段:
class Specific {
private String name;
private int age;
private List<String> friends;
// Define getters etc.
}
让您的IDE为您生成样板代码。或者查看Google's AutoValue之类的内容,它会在编译时为您生成类。
答案 2 :(得分:0)
例如并发问题。 它还可以假设您可以使用键识别所需对象的所有实例。