Java 用HashMap替换类属性有什么问题吗?

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

这只是一个理论问题,可能会引起设计方面的一些考虑。如果用这个可重用类替换POJO呢?它可能会避免一些样板代码,但它会带来什么问题

// 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
您的POJO是类,表示现实世界中某个事物的抽象。 如果我很理解你想把它们的属性放在地图里,这不是一个好的设计。你反对使用OOP。如果您这样想,您可以将所有类放在一个大字符串中,并按位置搜索它们,这比只使用属性作为键的字典要好。

  • 不是编译检查
  • 你必须低调,这不好
  • 难以维持
  • 反对OOP
您的POJO是类,表示现实世界中某个事物的抽象。
如果我很理解你想把它们的属性放在地图里,这不是一个好的设计。你反对使用OOP。如果您这样想,您可以将所有类放在一个大字符串中,并按位置搜索它们,这比只使用属性作为键的字典要好。

您的
set
方法应该调用
get
?不。固定的在记事本中写道:p我的浏览器中的代码检查器不是最好的;)+一个好问题,因为有些语言是这样做的,有些游戏是这样写的,游戏可能是一个特例。例如,我见过一个流行的射击手使用公共属性。不知道这是出于性能原因还是为了争取时间。您的
set
方法是否应该调用
get
?否。固定的在记事本中写道:p我的浏览器中的代码检查器不是最好的;)+一个好问题,因为有些语言是这样做的,有些游戏是这样写的,游戏可能是一个特例。例如,我见过一个流行的射击手使用公共属性。我不知道这是出于性能原因还是仅仅为了争取时间。我想知道的是,我想知道为什么没有采用这种方法。答案应该提供一些很好的见解。关于编译时检查的评论非常好。至于检查,你是指类外的代码吗?如何使用包装器来处理此问题?您必须防止调用
get(someProperty)
而每次调用它时它都不存在的情况。在这种情况下你会怎么做?同样如前所述,这种方法是尝试模拟一种动态类型的语言——你最好使用一种更灵活/功能性更强的语言,这种语言的设计考虑到了动态类型。正如你所知,我想知道为什么没有采用这种方法。答案应该提供一些很好的见解。关于编译时检查的评论非常好。至于检查,你是指类外的代码吗?如何使用包装器来处理此问题?您必须防止每次调用时调用
get(someProperty)
但它不存在的情况