Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 映射与类属性建议_Java_Properties - Fatal编程技术网

Java 映射与类属性建议

Java 映射与类属性建议,java,properties,Java,Properties,我正在编写一个程序,其中包含一系列类,这些类将被序列化以保存在数据库中,并通过网络发送 为了使通过命令行界面访问类属性变得更容易,我考虑将属性存储在Map类中,而不是给每个属性赋予它自己的变量 基本上,不要使用这样的东西: String id = account.getUserId(); enum StringPropertyType { USERID, FIRSTNAME, LASTNAME } interface StringAttributes { String get(

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

为了使通过命令行界面访问类属性变得更容易,我考虑将属性存储在Map类中,而不是给每个属性赋予它自己的变量

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

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!我觉得继续这样做会更好。谢谢!我觉得继续这样做会更好。非常感谢!我只能给一个答案打绿色支票,但如果我能做得更多,你也会得到一个。别担心,我不是为了分数而参加的。。。。如果你还有什么问题,我很乐意回答!我只能给一个答案打绿色支票,但如果我能做得更多,你也会得到一个。别担心,我不是为了分数而参加的。。。。如果你还有任何问题,我很乐意详细说明