Java 的 instanceof 能否区分功能相同的 类?

Can Java's instanceof differentiate functionally identical classes?

所以假设我有两个几乎相同的 classes,但是它们代表具有关键差异的对象。目前,这些差异并未真正实现。

例如,一个 class,我们称之为 MorningShiftWorker,与另一个我们称之为 EveningShiftWorker 具有完全相同的方法和相同的构造函数。这两个对象都存储在它们的超类型 ShiftWorker.

的列表中

从逻辑上讲,将这两个组分开是有意义的,但与其添加额外的变量,不如使用 [=16= 检查 ShiftWorker 列表中的对象].

我的问题是:instanceof 是否足够聪明以区分苹果和橙子?这两个 class 目前除名称外完全相同。这足以让 instanceof 将它们区分开来,还是我应该采用另一种方法来解决这个问题?

是的 instanceof "smart" 就足够了,因为 java 使用名称来区分 objects/classes 而不是结构

instanceof 运算符不比较 类 的内容。它非常清楚 x 是否是 instanceof y,即使 xy 除了名称完全相同 类。

它只检查第一个参数是否在第二个参数的继承层次中,即一切都是instanceof ObjectIntegerFloat及其朋友instanceof Number 当然还有 x instanceof y 类型 y.

的所有对象 x

是的,instanceof 本质上是检查对象是否可以正确转换为给定的 class。假设我们有这些 classes:

public class Fruit {}
public class Orange extends Fruit {}
public class Apple extends Fruit {}

然后我们尝试一些方法:

Fruit f = new Apple();
boolean isOrange = f instanceof Orange; //False

这也适用于 empty/non-functional 接口。

你问错问题了。你应该问:"how do I fix my broken design"。

如果您必须 class 是 "nearly" 相同的,但在其方法和构造函数中共享 "duplicated" 代码;那么你正在做一些错误的事情

永远不会重复代码。

所以,不用担心 instanceof;你应该退后一步,重新设计你的 class 层次结构,找到你如何最终实现 commoncommon 的方法事物;这样您的早班和晚班只包含 "those different aspects".

您可能想查看 Robert Martin 的 "Agile principles"。那本书包含一个关于 "payment system" 的真实示例;并详细解释了如何创建一个系统,在该系统中,您的员工以截然不同的模式获得报酬——而不是到处重复。 (您甚至可以在互联网上免费找到 "C#" 版本的 PDF)。