Java 映射与类属性建议
我正在编写一个程序,其中包含一系列类,这些类将被序列化以保存在数据库中,并通过网络发送 为了使通过命令行界面访问类属性变得更容易,我考虑将属性存储在Map类中,而不是给每个属性赋予它自己的变量 基本上,不要使用这样的东西:Java 映射与类属性建议,java,properties,Java,Properties,我正在编写一个程序,其中包含一系列类,这些类将被序列化以保存在数据库中,并通过网络发送 为了使通过命令行界面访问类属性变得更容易,我考虑将属性存储在Map类中,而不是给每个属性赋予它自己的变量 基本上,不要使用这样的东西: String id = account.getUserId(); enum StringPropertyType { USERID, FIRSTNAME, LASTNAME } interface StringAttributes { String get(
String id = account.getUserId();
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); }
}
我会这么做
String id = account.properties.get("userId");
这是一种明智的做法吗?是的,这是一种非常明智的模式。它有时被称为,非常类似于JavaScript中的工作方式,在JavaScript中,每个对象实际上都是一个映射。这反过来又导致了非常流行的JSON序列化格式 不错的功能: 你不必担心凌乱的继承继承权-你可以随意改变财产。 只需从另一个对象复制原型,即可创建新对象 操作数据的代码可以以统一的方式进行操作,而无需显式命名所有变量。 与静态类定义相比,它更具动态性-扩展和修改对象更容易 潜在风险/不利因素: 如果使用字符串,则需要跟踪属性名-编译器不会为您这样做!使用枚举作为键可以缓解此问题,但这样会失去一些灵活性。。。 您没有得到静态类型检查的好处,因此您可能会发现需要编写更多的JUnit测试来确保一切正常工作 由于地图查找速度非常快,因此可能会有轻微的性能开销,但这还不足以令人担忧 事实上,我在90年代用这个对象模型的一个变体写了一个完整的游戏,效果非常好 <>而不是让一个MAP对象暴露出来,您可能需要考虑封装这个功能,以便可以在对象本身上使用一个访问器方法,例如
String id = account.getProperty("userId");
是的,这是一个相当合理的模式。它有时被称为,非常类似于JavaScript中的工作方式,在JavaScript中,每个对象实际上都是一个映射。这反过来又导致了非常流行的JSON序列化格式 不错的功能: 你不必担心凌乱的继承继承权-你可以随意改变财产。 只需从另一个对象复制原型,即可创建新对象 操作数据的代码可以以统一的方式进行操作,而无需显式命名所有变量。 与静态类定义相比,它更具动态性-扩展和修改对象更容易 潜在风险/不利因素: 如果使用字符串,则需要跟踪属性名-编译器不会为您这样做!使用枚举作为键可以缓解此问题,但这样会失去一些灵活性。。。 您没有得到静态类型检查的好处,因此您可能会发现需要编写更多的JUnit测试来确保一切正常工作 由于地图查找速度非常快,因此可能会有轻微的性能开销,但这还不足以令人担忧 事实上,我在90年代用这个对象模型的一个变体写了一个完整的游戏,效果非常好 <>而不是让一个MAP对象暴露出来,您可能需要考虑封装这个功能,以便可以在对象本身上使用一个访问器方法,例如
String id = account.getProperty("userId");
我通常喜欢这样做:
String id = account.getUserId();
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>
相反..我更喜欢这样做:
String id = account.getUserId();
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>
相反,..我建议按上述方法操作,但使用enum而不是Strings。我建议按上述方法操作,但使用enum而不是StringsHanks!我觉得继续这样做会更好。谢谢!我觉得继续这样做会更好。非常感谢!我只能给一个答案打绿色支票,但如果我能做得更多,你也会得到一个。别担心,我不是为了分数而参加的。。。。如果你还有什么问题,我很乐意回答!我只能给一个答案打绿色支票,但如果我能做得更多,你也会得到一个。别担心,我不是为了分数而参加的。。。。如果你还有任何问题,我很乐意详细说明