【问题标题】:Conditionally constant properties in classes: what's the best practice?类中的条件常量属性:最佳实践是什么?
【发布时间】:2016-06-19 23:09:07
【问题描述】:

我有一种情况,多个类可以扩展一个核心类。有一个属性(例如,isAtomic),在某些子类中将依赖于数据,但在其他子类中将始终为true。如果可能的话,我希望在后一种情况下支票尽可能便宜。我可以想到几种方法:

  1. 显而易见:abstract bool isAtomic() 将在“常量”子类中实现为 return true/false,

  2. 一个子类 Atomic extends Base 将实现 isAtomic() 为 return true; 并且其他“常量”子类将扩展(可能与 1 差别不大),

  3. 将isAtomic 实现为return true; 的基类以及覆盖此定义的非常量子类,

  4. 由原子子类实现的接口Atomic,显然不会返回任何内容,但会使用x instanceof Atomic || x.isAtomic()进行检查。

我在 OOP 方面不是太有经验,但有些事情告诉我,最后一种方法很好地代表了这个概念并节省了函数调用,即使使用更复杂。但我不知道instanceof 是否确实比调用函数“便宜”。 3 应该比 1 或 2 快,但感觉不符合 isAtomic 函数的性质。专家怎么说?还是有其他直观的方法,比我没有想到的更好?

【问题讨论】:

  • 如果您使用的是 Java 8,您可以使用默认实现在 interface 中声明 isAtomic()。
  • 仅供参考,#4 被称为marker interface 模式。
  • @MickMnemonic:这与#3 有什么实际区别吗?在那些本质上不是原子的类中,我仍然必须实现相同的接口并覆盖函数,对吗?
  • 从抽象类扩展和实现接口有很大的不同。您只能扩展一个类,但可以实现多个接口。哪个更好,取决于您的代码库。
  • instanceof 通常比函数调用昂贵得多。

标签: java oop


【解决方案1】:

选择您的首选。这里没有人能说出哪个选项最适合您的特定情况。如果第一个选择被证明是一个糟糕的选择,而您必须重新审视它,那么您就会学到一些东西。

至于效率,JVM 可以内联对短方法的调用。即使您正在调用抽象方法,也可能发生这种情况,尤其是当调用站点是单态的时。性能优化非常困难,所以在你知道你会遇到问题之前不要担心。

我有一种情况,多个类可以扩展一个核心类。

我对你的程序一无所知,但可能想避免这种情况。

【讨论】:

  • 谢谢!不知道抽象方法可能会发生内联,这使得情况非常容易。您能否详细说明最后一行(供将来参考:避免许多扩展公共基础的类)?
  • 继承经常被误用,导致程序难以理解、难以修改。您可以找到许多关于此主题的文章和长时间的讨论以及存在哪些替代方案,例如在互联网上搜索“组合而不是继承”或programmers.stackexchange.com/questions/260343/…
  • 哦,我明白了。我很了解该主题,并在设计模型时将其考虑在内。谢谢,第一选择是我当时选的!
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 2015-07-05
  • 2021-05-28
  • 2010-10-04
相关资源
最近更新 更多