Java 用HashMap替换类属性有什么问题吗?
这只是一个理论问题,可能会引起设计方面的一些考虑。如果用这个可重用类替换POJO呢?它可能会避免一些样板代码,但它会带来什么问题Java 用HashMap替换类属性有什么问题吗?,java,attributes,hashmap,getter-setter,Java,Attributes,Hashmap,Getter Setter,这只是一个理论问题,可能会引起设计方面的一些考虑。如果用这个可重用类替换POJO呢?它可能会避免一些样板代码,但它会带来什么问题 // Does not include failsafes, guards, defensive copying, whatever... class MySingleGetterAndSetterClass{ private HashMap<String,Object> myProperties; public SingleGett
// Does not include failsafes, guards, defensive copying, whatever...
class MySingleGetterAndSetterClass{
private HashMap<String,Object> myProperties;
public SingleGetterAndSetter( String name ){
myProperties = new HashMap<String,Object>();
myProperties.put( "name", name );
}
public Object get( string propertyName ){
return myProperties.get( propertyName );
}
public Object set( string propertyName, Object value ){
myProperties.put( propertyName, value );
}
}
//不包括故障保护、防护、防御性复制等等。。。
类MySingleGetter和SetterClass{
私有HashMap属性;
公共单getterandsetter(字符串名称){
myProperties=newHashMap();
myProperties.put(“名称”,名称);
}
公共对象获取(字符串propertyName){
返回myProperties.get(propertyName);
}
公共对象集(字符串propertyName,对象值){
put(propertyName,value);
}
}
这将导致非常不稳定的代码。编译时不会检查任何获取/设置。通常,您希望代码快速失败,而编译时间是绝对最快的
为了使其相对安全,您必须在所有地方进行空检查/异常处理,然后如何在代码中始终处理找不到值的情况?它会很快变得非常膨胀。这将导致非常不稳定的代码。编译时不会检查任何获取/设置。通常,您希望代码快速失败,而编译时间是绝对最快的 为了使其相对安全,您必须在所有地方进行空检查/异常处理,然后如何在代码中始终处理找不到值的情况?它会很快变得非常臃肿。主要缺点
- 慢得多
- 使用更多内存
- 少式安全
- 更容易出错
- 更难维护
- 要编写/读取的更多代码
- 更多的线程安全问题(更多的中断方式)和更难使线程安全
- 更难调试的是,请注意,字段的顺序可以伪随机排列,对于相同“类型”的不同对象不同,这使得它们更难读取
- 更难重构
- 很少或不支持代码分析
- 不支持代码完成
顺便说一句,一些动态语言完全按照您的建议执行,它们有所有这些问题。主要缺点
- 慢得多
- 使用更多内存
- 少式安全
- 更容易出错
- 更难维护
- 要编写/读取的更多代码
- 更多的线程安全问题(更多的中断方式)和更难使线程安全
- 更难调试的是,请注意,字段的顺序可以伪随机排列,对于相同“类型”的不同对象不同,这使得它们更难读取
- 更难重构
- 很少或不支持代码分析
- 不支持代码完成
顺便说一句,有些动态语言完全按照您的建议执行,它们存在所有这些问题。
- 不是编译检查
- 你必须低调,这不好
- 难以维持
- 反对OOP
- 不是编译检查
- 你必须低调,这不好
- 难以维持
- 反对OOP
如果我很理解你想把它们的属性放在地图里,这不是一个好的设计。你反对使用OOP。如果您这样想,您可以将所有类放在一个大字符串中,并按位置搜索它们,这比只使用属性作为键的字典要好。您的
set
方法应该调用get
?不。固定的在记事本中写道:p我的浏览器中的代码检查器不是最好的;)+一个好问题,因为有些语言是这样做的,有些游戏是这样写的,游戏可能是一个特例。例如,我见过一个流行的射击手使用公共属性。不知道这是出于性能原因还是为了争取时间。您的set
方法是否应该调用get
?否。固定的在记事本中写道:p我的浏览器中的代码检查器不是最好的;)+一个好问题,因为有些语言是这样做的,有些游戏是这样写的,游戏可能是一个特例。例如,我见过一个流行的射击手使用公共属性。我不知道这是出于性能原因还是仅仅为了争取时间。我想知道的是,我想知道为什么没有采用这种方法。答案应该提供一些很好的见解。关于编译时检查的评论非常好。至于检查,你是指类外的代码吗?如何使用包装器来处理此问题?您必须防止调用get(someProperty)
而每次调用它时它都不存在的情况。在这种情况下你会怎么做?同样如前所述,这种方法是尝试模拟一种动态类型的语言——你最好使用一种更灵活/功能性更强的语言,这种语言的设计考虑到了动态类型。正如你所知,我想知道为什么没有采用这种方法。答案应该提供一些很好的见解。关于编译时检查的评论非常好。至于检查,你是指类外的代码吗?如何使用包装器来处理此问题?您必须防止每次调用时调用get(someProperty)
但它不存在的情况