使用这个系统有什么问题吗?
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保证给定键具有特定类型的值。这意味着您需要对对象进行转换才能将它们取回(并希望转换不会失败...)
如果您需要共享项目,请考虑拥有一个存储库,每个对象类型一次。然后您可以查询此存储库中的项目,并且您可以根据需要修改它们。
请记住,这可能会导致并发问题,因此请相应地构建您的存储库。
在构建软件时,我经常发现我需要提供大量实例,以便它们可以引用彼此的非静态成员。我可以创建一个 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保证给定键具有特定类型的值。这意味着您需要对对象进行转换才能将它们取回(并希望转换不会失败...)
如果您需要共享项目,请考虑拥有一个存储库,每个对象类型一次。然后您可以查询此存储库中的项目,并且您可以根据需要修改它们。
请记住,这可能会导致并发问题,因此请相应地构建您的存储库。