【发布时间】:2016-06-19 23:09:07
【问题描述】:
我有一种情况,多个类可以扩展一个核心类。有一个属性(例如,isAtomic),在某些子类中将依赖于数据,但在其他子类中将始终为true。如果可能的话,我希望在后一种情况下支票尽可能便宜。我可以想到几种方法:
显而易见:
abstract bool isAtomic()将在“常量”子类中实现为return true/false,一个子类
Atomic extends Base将实现isAtomic()为return true;并且其他“常量”子类将扩展(可能与 1 差别不大),将
isAtomic实现为return true;的基类以及覆盖此定义的非常量子类,由原子子类实现的接口
Atomic,显然不会返回任何内容,但会使用x instanceof Atomic || x.isAtomic()进行检查。
我在 OOP 方面不是太有经验,但有些事情告诉我,最后一种方法很好地代表了这个概念并节省了函数调用,即使使用更复杂。但我不知道instanceof 是否确实比调用函数“便宜”。 3 应该比 1 或 2 快,但感觉不符合 isAtomic 函数的性质。专家怎么说?还是有其他直观的方法,比我没有想到的更好?
【问题讨论】:
-
如果您使用的是 Java 8,您可以使用默认实现在
interface中声明isAtomic()。 -
仅供参考,#4 被称为marker interface 模式。
-
@MickMnemonic:这与#3 有什么实际区别吗?在那些本质上不是原子的类中,我仍然必须实现相同的接口并覆盖函数,对吗?
-
从抽象类扩展和实现接口有很大的不同。您只能扩展一个类,但可以实现多个接口。哪个更好,取决于您的代码库。
-
instanceof通常比函数调用昂贵得多。