Java instanceof:理解instanceof如何工作
Java充满了有利于开发人员的高性能特性。这些特性之一是能够确定一个对象是否恰好是特定类型的实例。
在本文中,我们将首先探讨一些涉及Java类型系统的背景概念。然后,我们将正式介绍instanceof操作符。之后,我们将讨论一个需要注意的小gotcha实例。然后,我们将对到此为止的所有内容进行假想的设计审查,并考虑是否有比instanceof更好的选择。如果您想更深入地了解这个Java概念,可以考虑使用它高级Java编程课程让你的技能更上一层楼。
在Java类型
Java体现了一个面向对象的范例。它允许您定义任意的类层次结构,其中几乎任意两个类都可以有继承关系,一个是父类,一个是子类。自然地,子进程继承父进程的属性。
作为一个例子,我们将定义一个名为Employee的基类,并定义两个名为engineingemployee和MarketingEmployee的子类,它们都继承自Employee。这允许我们在employee内部定义大部分员工数据和业务逻辑。同时,我们可以在各自的类中定义特定于工程师和营销人员的数据和业务逻辑:engineingemployee和MarketingEmployee。
我们可以创建MarketingEmployee的实例,它将具有所有基本的Employee数据和功能。
在上面的例子中,我们说myMarketingEmployee是MarketingEmployee的一个实例,而且,它也是Employee的一个实例。这就是Java类型系统(包括继承)的工作方式。
现在想象一个场景,我们有一个对象的引用,我们在编译时只知道它是一个Employee。想象一下,我们需要确定是工程师还是市场营销人员,这样我们才能对他们中的任何一个采取适当的行动。因为这种情况经常发生,所以Java提供了instanceof操作符。
使用Eclipse吗?看看这个课程如何使用Eclipse编写Java程序!
instanceof操作符
instanceof操作符相对简单。当您有一个对象的引用,并且您想知道该对象是否是特定类型的实例时,您将使用它。
在上面的例子中,我们有一个对Employee的引用,但是,由于假设的需求,我们需要确定它是一个EngineeringEmployee还是一个MarketingEmployee。instanceof操作符允许我们做出这个决定。
请注意,在上面的示例中,我们如何能够将工资业务逻辑放在ProcessEmployee()方法中,而不是放在各种假想的特定于角色的方法中,比如processengineingemployee()、processhemployee()、ProcessManagementEmployee()等。这是面向对象编程中一个非常普遍的优势:您倾向于编写更少的代码来完成重复的任务。
想要创建网络程序?查看本教程使用Java Spring框架进行web编程.
陷阱:测试一个空对象
让我们来看看其中一个问题。当您有一个对象的引用(碰巧是一个特定类型的实例),然后将该引用设置为null时,Java类型系统将报告该对象不是预期类型的实例。
结果:
instanceof =坏软件设计的指示器?
现在让我们回顾一下,看看我们的类层次结构,并考虑是否应该编写需要使用instanceof操作符的代码。虽然上面给出的小例子确实说明了正确使用的基本实例,但是软件作为一个整体实际上是一个糟糕的软件设计的经典例子。仅仅看一下代码,并且没有一组真实世界的软件需求,摆脱实例检查似乎是安全的。在这种情况下,推荐的设计模式倾向于使用虚拟方法(这本身是另一个主题——您可以在本课程的Java基础中探索它)。
按照这个思路,我们可以做的第一个更改是向Employee类添加PerformTask()方法。
在Java中,方法默认是虚拟的。要覆盖子类中的方法,只需添加具有相同名称的方法。
现在,当对Employee引用调用PerformTask()时,将调用相应的重写方法,假设Employee引用实际上指向engineingemployee的一个实例或MarketingEmployee的一个实例。
如您所见,我们进一步压缩了代码。看起来instanceof可以被完全去掉了。
但是,如果您还记得,前面几段我们说过这个假设的软件缺少“一组真实世界的软件需求”。事实是,真实世界的软件需求是相当不宽容的,并且很少考虑软件开发团队通常所处的时间限制。betwayapp下载安装有时使用instanceof,尽管在设计方面并不完美——至少在学术环境中,是按时完成项目的正确方法。其他时候,软件需求非常复杂,没有明显的方法可以更优雅地解决问题。最后,instanceof操作符只是软件工程师工具箱中的另一个工具,您必须明智地使用它。它可能会让纯粹主义者嘲笑,但它至少能让代码工作。
同时,您必须熟悉软件设计最佳实践。除了是正确的事情,它也有实际应用。除非您是在完全隔离的情况下工作(非常不可能),否则您的代码将被其他开发人员读取、共享,并可能被重构。了解最佳实践通常可以区分一个成功的项目和一个失败的项目。
您可以在本文中了解更多关于Java最佳实践的内容Java基础课程.
在这节课中,我们是不是漏掉了instanceof的一些内容?请在下面的评论中告诉我们!