java - 关于封装的问题(Book : HF OOA&D )

标签 java oop ooad

我正在读这本书(《深入浅出面向对象设计与分析》)。在第 5 章中有一个建议,我想对此有一些其他的看法。书上说:

"When you have a set of properties that vary across your objects, use a collection, like a Map to store those proeprties dynamically."

此外,还有一些解释为什么要这样做:

"You'll remove lots of methods from your classes, and avoid having to change your code when new properties are added to your app".

我确实了解这种方法的优势,但是否也可以缩减规模?我的意思是,如果我使用映射来存储这些信息(在示例中它是一个字符串到枚举映射)并提供一个 getProperty(String) 方法来访问,则该方法的调用者实际上必须知道允许使用哪些字符串。我不喜欢这个。我的意思是,您当然可以争辩说可以在允许输入的 javadoc 中说明。

这真的是处理此类问题的方法吗?还有其他选择吗?我知道用继承来做这件事并不好,因为有大量的子类,而这些子类不会覆盖任何东西,只是添加新的属性,这在我看来并不是那么好。

最佳答案

我个人认为使用 Map 而不是实际字段是一个糟糕的主意。我不幸地使用了广泛采用这种(反)模式的系统,维护起来简直是一场噩梦。

我认为绝对没有理由使用映射来“面向 future ”,您可以避免必须添加新方法的论点是可笑的,尤其是当您考虑到添加一个新字段需要大约 20 次击键、添加 getter 和 setter 时再点击 3-4 次鼠标。你得到的是什么,你失去的是类型安全和编译时检查,控制和监视设置内容和时间的能力,更不用说你破坏了封装原则。

还应该注意到,Java 语言本身的发展一直在朝着越来越多的编译时检查方向发展,枚举和泛型是这个方向最明显的例子。全部扔掉比1.3-1.4时代还惨

只有当某些东西是真正动态的时候才应该使用映射,也就是说,在编译时不可能知道键列表。

关于java - 关于封装的问题(Book : HF OOA&D ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5035633/

相关文章:

PHP 面向对象编程 :Store methods in database

python - 在 python 中使类数据可继承的正确方法是什么?

java - 使用嵌套对象处理父类和子类的继承

java - 图形绘制问题

java:如何使用内部类实现手绘绘图

Java:如何检查 Windows 上是否安装了 MySQL?

java - 我们能得到的最接近 OO 软件设计中的概念和指导原则的明确列表是什么?

java - 过程代码和领域驱动设计风格代码有什么区别?

oop - 反射是否违反了 LSP?

java - Eclipse 插件开发教程 - 2013