使用这个系统有什么问题吗?

Is there anything wrong with using this system?

在构建软件时,我经常发现我需要提供大量实例,以便它们可以引用彼此的非静态成员。我可以创建一个 class(在 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);
    }
}

然后您可以传递这个 class 并让每个使用它的对象将自己添加到处理程序中,这样您就可以很容易地在实例之间共享东西。您甚至可以制作此 class 的 "static" 版本并添加常用变量,例如屏幕尺寸。

我觉得在软件设计层面上使用上面的方法是相当糟糕的。这有什么"wrong"吗?

它的主要问题是您丢失了类型信息:您不知道 Handler 的任何给定实例是否具有给定键,并且您不知道与该键关联的值是否属于给定类型。

这不一定是个问题 - 您只需要付出更多的努力来确保您放入正确的东西,并验证您从中得到了您期望的东西。

您最好为每个目的定义一个自定义 class,具有语义上有意义的字段:

class Specific {
  private String name;
  private int age;
  private List<String> friends;

  // Define getters etc.
}

让您的 IDE 为您生成样板代码。或者查看 Google's AutoValue 之类的东西,它会在编译时为您生成 classes。

例如并发问题。 它还假设您可以使用键识别所需对象的所有实例。

您描述的方法的问题是您无法强制and/or保证给定键具有特定类型的值。这意味着您需要对对象进行转换才能将它们取回(并希望转换不会失败...)

如果您需要共享项目,请考虑拥有一个存储库,每个对象类型一次。然后您可以查询此存储库中的项目,并且您可以根据需要修改它们。

请记住,这可能会导致并发问题,因此请相应地构建您的存储库。