instanceof 与 getClass( )

2024-07-01

我发现使用时性能有所提高getClass() and ==运算符结束instanceOf操作员。

Object  str = new Integer("2000");

long starttime = System.nanoTime();

if(str instanceof String) {
    System.out.println("its string");
} else {
    if (str instanceof Integer) {
        System.out.println("its integer");

    }
}

System.out.println((System.nanoTime()-starttime));

starttime = System.nanoTime();

if(str.getClass() == String.class) {
    System.out.println("its string in equals");
} else {
    if(str.getClass() == Integer.class) {
        System.out.println("its integer");
    }
}

System.out.println((System.nanoTime()-starttime));

有没有任何指南,该使用哪一个getClass() or instanceOf?

给定一个场景:我知道要匹配的确切类,即String, Integer(这些是期末课程)等等。

正在使用instanceOf操作员的不良做法?


其性能的原因是instanceof and getClass() == ...不同的是,他们做的事情不同。

  • instanceof测试左侧 (LHS) 的对象引用是否是右侧 (RHS) 类型的实例或某些子类型.

  • getClass() == ... 测试类型是否相同。

因此,建议忽略性能问题并使用能为您提供所需答案的替代方案。

正在使用instanceOf操作员的不良做法?

不必要。过度使用其中任何一个instanceOf or getClass() may be“设计气味”。如果您不小心,您最终会得到这样的设计:添加新子类会导致大量代码返工。在大多数情况下,首选方法是使用多态性。

然而,在某些情况下,这些并不是“设计气味”。例如,在equals(Object)您需要测试参数的实际类型,然后返回false如果不匹配。最好使用getClass().


Terms like "best practice", "bad practice", "design smell", "antipattern" and so on should be used sparingly and treated with suspicion. They encourage black-or-white thinking. It is better to make your judgements in context, rather than based purely on dogma; e.g. something that someone said is "best practice". I recommend that everyone read No Best Practices https://www.satisfice.com/blog/archives/5164 if they haven't already done so.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

instanceof 与 getClass( ) 的相关文章

  • JDK:如何以编程方式启用 PlatformLogger

    我需要以编程方式启用某些 JDK7 内部类的日志记录 这就是我在应用程序初始化时所做的事情 httpLogger Logger getLogger sun net www protocol http HttpURLConnection ht
  • android下拉刷新列表视图出错

    我正在使用功能下拉来刷新library https github com chrisbanes Android PullToRefresh克里斯班斯的 但是当我尝试在我的 xml 文件中导入这个小部件时 它向我显示以下错误 请帮助我如何解决
  • 如果没有发生触摸事件,Android SurfaceView 会变慢

    我正在制作一款游戏 除了游戏循环之外一切都很顺利 我正在使用 SurfaceView 并绘制 2D Sprites 位图 目前游戏是一艘穿过小行星带的飞船 飞船停留在屏幕中央 手机向任一方向倾斜以移动小行星 小行星改变位置而不是玩家 当旧的
  • 在 Maven 存储库中查找 Oracle JDBC 驱动程序

    我想将 oracle jdbc 驱动程序作为依赖项 运行时范围 添加到我的项目中 ojdbc14 在 MVNrepository 站点中 放入 POM 的依赖项是
  • 按下 JButton 时运行函数

    我正在尝试用java编写一个程序 使用机器人每隔几秒按一次特定的键 它有一个带有开始和停止按钮的 GUI 以及一个告诉其处于哪个状态的标签 到目前为止 我已经完成了所有工作 除了当我单击 开始 时 它运行我的机器人功能的循环 这是无限的 没
  • 从批处理文件运行 .jar

    我已经创建了一个可执行文件 jar文件 我怎样才能执行 jar使用批处理文件而不提及类路径 在 Windows 上 您可以使用以下命令 start javaw jar JarFile jar 通过这样做 命令提示符窗口不会保持打开状态
  • 您使用什么来进行复杂的构建过程? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试改进我们的构建过程 目前它是一个巨大的 Ant build xml 它调用其他 ant 构建
  • Java 让物体在按住按钮时移动

    如何使 JPanel 在按住按钮时移动并在释放按钮时停止 我尝试过将 thread start 与 Runnable 一起使用以及类似的方式 我总是遇到错误 有人可以帮助我吗 您需要考虑许多重要的因素 按钮的设计初衷并非如此 它们被设计为在
  • 关于final关键字的java基础知识

    方法中可以使用final关键字吗 绝对地 这final关键字几乎可以应用于任何事物 在每种情况下都意味着 您无法再更改它 这就是它应用于时的含义 一个变量 您根本无法为变量分配新值 将其呈现为constant 当然 a method 您不能
  • Java:检查数组的相等性(顺序无关紧要)

    我有两个String数组 比方说 String s1 a b c String s2 c a b 这些数组应该相等 我想以 最干净 的方式检查它们的相等性 我尝试使用Arrays equals s1 s2 但我得到了一个错误的答案 我想这个
  • 用java.nio在内存中写入文件?

    使用 nio 可以映射内存中的现有文件 但是是否可以仅在内存中创建它而不在硬盘驱动器上创建文件 我想模仿 CreateFileMapping 窗口函数 它允许您在内存中写入 Java 中有等效的系统吗 目标是写入内存以便另一个程序 c 读取
  • 在 onClick 处理程序的活动类 [...] 中找不到方法 [...](View)

    当我按下按钮时fragment main xml 出现这个错误 java lang IllegalStateException Could not find a method sendMessage View in the activity
  • 以编程方式创建 PDF 相册

    我有一组 PDF 相册模板 它们有空白方块 用于放置文本和照片 我的需要是使用这些模板来生成实际的专辑 我的计划是使用 iText 和 Java 我会向应用程序发送一个包含所有要使用的图像 URL 的数组 我将确切地知道图像应该放置在模板上
  • 泛型类中可空的泛型字段

    我正在尝试做这样的事情 public class MySuperCoolClass
  • Android UserManager.isUserAGoat() 的正确用例?

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我正在查看 中引入的新 API安卓4 2 http en wikipedia org wiki Android version
  • Spring Boot Rest - 如何配置 404 - 找不到资源

    我得到了一个有效的春季靴休息服务 当路径错误时 它不会返回任何内容 完全没有反应 同时它也不会抛出错误 理想情况下 我预计会出现 404 未找到错误 我有一个 GlobalErrorHandler ControllerAdvice publ
  • RMI服务器异常

    当我尝试运行使用远程注册表的服务器时 我收到以下来自 RMI 的异常 我的 Server2 类中 main 方法的注册表代码是 Registry registry LocateRegistry getRegistry 192 168 1 4
  • Hibernate 中的枚举,作为枚举持久存在

    在我的 MySQL 数据库中 有一列 gender enum male female 我创建了我的枚举 com mydomain myapp enums Gender 并在我的Person实体我被定义为 性别 现在我想将枚举类型保留在我的
  • 在 Java 8 中使用 Lambda 将流收集到 HashMap 中

    我有一个 HashMap 我需要使用一些函数来过滤它 HashMap
  • 在 JSP 中呈现 JSON 数据的最佳实践是什么?

    我需要在 JSP 中针对某些 AJAX 请求呈现 JSON 数据 我想知道在易用性和稳定性方面最好的方法是什么 假设您想要从一个或多个 Java 对象生成 JSON 以下是一种相当简单的方法 将 Java 对象设置为请求 会话范围内的属性

随机推荐