【问题标题】:Is there anything wrong with replacing class attributes with a HashMap?用 HashMap 替换类属性有什么问题吗?
【发布时间】:2013-06-18 02:01:19
【问题描述】:

只是一个理论上的问题,可能会导致设计方面的一些考虑。如果你用这个可重用的类替换 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 );
    }

}

【问题讨论】:

  • 你的 set 方法应该调用 get 吗?
  • 不。固定的。在记事本中写了这个:p
  • 我浏览器中的代码检查器不是最好的;)
  • +1 好问题,因为有些语言会这样做,有些游戏是这样写的stackoverflow.com/questions/17159592/…
  • 游戏可能是个特例。例如,我见过一个使用公共属性的流行射手。不知道这是出于性能原因还是只是为了争取时间。

标签: java attributes hashmap getter-setter


【解决方案1】:

主要缺点

  • 慢得多
  • 使用更多内存
  • 更少的类型安全
  • 更容易出错
  • 更难维护
  • 更多可写/读的代码
  • 更多线程安全问题(更多破解方法)和更难确保线程安全。
  • 更难调试,注意字段的顺序可以伪随机排列,相同“类型”的不同对象的顺序不同,因此更难阅读。
  • 更难重构
  • 很少或不支持代码分析。
  • 不支持代码完成。

顺便说一句,一些动态语言完全按照您的建议进行操作,但它们存在所有这些问题。

【讨论】:

  • "顺便说一句,一些动态语言完全按照您的建议进行操作,并且存在所有这些问题。"我猜这样的解决方案存在于 PHP 中 :) 。如果我真的要做这样的事情,它会更倾向于类生成器或注释。
  • 如果你有一个不需要 Map 的类生成器,只需尽可能使用原语生成所有具有真实类型的实际字段。
【解决方案2】:

这会导致代码非常不稳定。您的任何获取/设置都不会在编译时进行检查。通常,您希望您的代码快速失败,而编译时间绝对是可以做到的最快速度。

为了使其相对安全,您必须在所有地方都进行空检查/异常处理,然后如何在整个代码中始终如一地处理找不到值的情况?它会很快变得非常臃肿。

【讨论】:

  • 只是让你知道,我想知道为什么这没有被采用。答案应该提供一些很好的见解。关于编译时检查的评论很棒。至于检查,您是指类外的代码吗?处理这个问题的包装器怎么样?
  • 您必须防范您调用get(someProperty) 的情况,并且每次调用它时它都不存在。在那种情况下你会怎么做?同样如前所述,这种方法有点试图模拟一种动态类型的语言——你最好使用一种设计时考虑到动态类型的更灵活/功能更强大的语言。
【解决方案3】:
  • 不进行编译检查。
  • 你必须垂头丧气,这不好。
  • 难以维护。
  • 反对OOP,

您的 pojo 是类,代表现实世界中某物的抽象。 如果我理解得很好,您想将它们的属性放在地图中,这不是一个好的设计。您反对使用 OOP。如果您以这种方式思考,您可以将所有类放在一个大字符串中并按位置搜索它们,这比只有一个以属性为键的字典要好。

【讨论】:

  • 您可能不需要进行空值检查,因为字段也可以包含空值。
  • @PeterLawrey 啊,是的,我忘记了,起初我误解了我以为他想存储 POJO 而不是属性:D,我会编辑,谢谢
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多