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
,即使 x
和 y
除了名称完全相同 类。
它只检查第一个参数是否在第二个参数的继承层次中,即一切都是instanceof Object
、Integer
、Float
及其朋友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 层次结构,找到你如何最终实现 common 的 common 的方法事物;这样您的早班和晚班只包含 "those different aspects".
您可能想查看 Robert Martin 的 "Agile principles"。那本书包含一个关于 "payment system" 的真实示例;并详细解释了如何创建一个系统,在该系统中,您的员工以截然不同的模式获得报酬——而不是到处重复。 (您甚至可以在互联网上免费找到 "C#" 版本的 PDF)。
所以假设我有两个几乎相同的 classes,但是它们代表具有关键差异的对象。目前,这些差异并未真正实现。
例如,一个 class,我们称之为 MorningShiftWorker
,与另一个我们称之为 EveningShiftWorker
具有完全相同的方法和相同的构造函数。这两个对象都存储在它们的超类型 ShiftWorker
.
从逻辑上讲,将这两个组分开是有意义的,但与其添加额外的变量,不如使用 [=16= 检查 ShiftWorker
列表中的对象].
我的问题是:instanceof
是否足够聪明以区分苹果和橙子?这两个 class 目前除名称外完全相同。这足以让 instanceof
将它们区分开来,还是我应该采用另一种方法来解决这个问题?
是的 instanceof "smart" 就足够了,因为 java 使用名称来区分 objects/classes 而不是结构
instanceof
运算符不比较 类 的内容。它非常清楚 x
是否是 instanceof y
,即使 x
和 y
除了名称完全相同 类。
它只检查第一个参数是否在第二个参数的继承层次中,即一切都是instanceof Object
、Integer
、Float
及其朋友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 层次结构,找到你如何最终实现 common 的 common 的方法事物;这样您的早班和晚班只包含 "those different aspects".
您可能想查看 Robert Martin 的 "Agile principles"。那本书包含一个关于 "payment system" 的真实示例;并详细解释了如何创建一个系统,在该系统中,您的员工以截然不同的模式获得报酬——而不是到处重复。 (您甚至可以在互联网上免费找到 "C#" 版本的 PDF)。