地图与类属性建议

时间:2012-05-18 04:00:38

标签: java properties

我正在编写一个程序,其中包含一系列类,这些类将被序列化以保存在数据库中并通过网络发送。

为了便于通过命令行界面访问类属性,我正在考虑将属性存储在Map类中,而不是为每个属性提供它自己的变量。

基本上,不要使用这样的东西:

String id = account.getUserId();

我会这样做

String id = account.properties.get("userId");

这是一种明智的做事方式吗?

2 个答案:

答案 0 :(得分:2)

是的,这是一个非常明智的模型。它有时被称为“prototype object model”,与您在JavaScript中的工作方式非常相似,其中每个对象实际上都是Map。这反过来导致了非常流行的JSON序列化格式。

好的功能:

  • 你不必担心凌乱的继承heirarchies - 你可以随意改变属性。
  • 只需复制另一个对象(原型)
  • 即可创建新对象
  • 操纵数据的代码可以统一的方式完成,而无需明确命名所有变量。
  • 与静态类定义相比,它更“动态” - 可以轻松扩展和修改对象

潜在风险/下行风险:

  • 如果您使用字符串,则需要跟踪您的属性名称 - 编译器不会为您执行此操作!使用Enums作为键可以缓解这个问题,但是你会失去一些灵活性......
  • 您没有获得静态类型检查的好处,因此您可能会发现需要编写更多JUnit测试以确保工作正常
  • 有轻微的性能开销(虽然可能不足以担心,因为地图查找非常快)

我实际上在90年代使用变体og这个对象模型(Tyrant)编写了整个游戏,并且效果非常好。

您可能需要考虑封装此功能,而不是让Map对象暴露,以便您可以在对象本身上使用访问器方法,例如。

String id = account.getProperty("userId");

答案 1 :(得分:2)

我喜欢这样做通常是这样的:

enum StringPropertyType {
   USERID, FIRSTNAME, LASTNAME
}

interface StringAttributes {
    String get(StringPropertyType s);
    void put(StringPropertyType s, String value);
}

class MapBasedStringAttributes implements StringAttributes {
    Map<StringPropertyType, String> map = new HashMap<~>();
    String get(StringPropertyType s) { return map.get(s); }
    void put(StringPropertyType s, String value) { map.put(s,value); }
}

这为您提供了编译时的安全性,重构等。

你也可以使用stringPropertyType.name()来获取枚举值的字符串表示并使用

Map<String,String> 

代替..