-1 是一个神奇的数字吗?反模式?代码味道?当局的引述和指南[重复]

2024-04-07

可能的重复:
不断的虐待? https://stackoverflow.com/questions/1862593/constant-abuse

我见过-1用于各种 API,最常用于搜索具有从零开始的索引的“集合”时,通常指示“未找到”索引。这“有效”是因为-1从一开始就不是一个合法的索引。似乎任何负数都应该有效,但我认为-1几乎总是被用作某种(不成文的?)约定。

我想至少目前将范围限制在 Java 上。我的问题是:

  • Sun 关于使用的官方说法是什么?-1作为这样的“特殊”返回值?
  • 关于这个问题有哪些引述,例如James Gosling、Josh Bloch,甚至 Java 之外的其他权威人物?
  • 过去关于这个问题有哪些值得注意的讨论?

这是类型不包含范围检查的语言中的常见习惯用法。 “越界”值用于指示几个条件之一。在这里,返回值指示两件事:1)是找到的字符,2)在哪里找到的。 使用 -1 来表示not found和一个非负索引found简洁地将这两者编码为一个值,并且事实是not-found不需要返回索引。

在具有严格范围检查的语言中,例如 Ada 或 Pascal,该方法可能会实现为(伪代码)

   bool indexOf(c:char, position:out Positive);

Positive是 int 的子类型,但仅限于非负值。

这将找到/未找到标志与位置分开。该位置作为输出参数提供 - 本质上是另一个返回值。它也可以是输入输出参数,从给定位置开始搜索。此处不允许使用 -1 来指示未找到,因为它违反了对 Positive 类型的范围检查。

java 中的替代方案是:

  • 抛出异常:这在这里不是一个好的选择,因为找不到字符并不是异常情况。
  • 将结果分成几种方法,例如boolean indexOf(char c); int lastFoundIndex();。这意味着对象必须保留状态,这在并发程序中不起作用,除非状态存储在线程本地存储中,或者使用同步 - 所有这些都会产生相当大的开销。
  • 分别返回位置和找到的标志:如boolean indexOf(char c, Position pos)。在这里,创建位置对象可能被视为不必要的开销。
  • 创建多值返回类型

such as

class FindIndex {
   boolean found;
   int position;
}

FindIndex indexOf(char c);

尽管它清楚地分隔了返回值,但它会产生对象创建开销。通过通过FindIndex作为参数,例如

FindIndex indexOf(char c, FindIndex start);

顺便说一句,多个返回值本来是 java (oak) 的一部分,但在 1.0 之前被取消,以缩短发布时间。詹姆斯·高斯林says http://www.gotw.ca/publications/c_family_interview.htm他希望他们也被包括在内。它仍然是一个想要的功能 https://bugs.java.com/bugdatabase/view_bug?bug_id=4222792.

我的看法是,使用魔法值是在单个返回值中编码多值结果(标志和值)的实用方法,而不需要过多的对象创建开销。

但是,如果使用魔法值,并且它们在相关 api 调用之间保持一致,那么使用起来会更好。例如,

   // get everything after the first c
   int index = str.indexOf('c');
   String afterC = str.substring(index);

Java 在这方面有所不足,因为在调用中使用了 -1substring将导致IndeOutOfBoundsException。相反,如果认为负值从字符串末尾开始,则在使用 -1 调用时,子字符串返回“”可能会更加一致。对错误条件的魔法值的批评者表示,返回值可以被忽略(或假设为正)。以有用的方式处理这些魔法值的一致 api 将减少检查 -1 的需要并允许更清晰的代码。

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

-1 是一个神奇的数字吗?反模式?代码味道?当局的引述和指南[重复] 的相关文章

  • 热重载在docker中运行的java程序

    我开发了一个java程序 应该在docker中运行 然而 我在调试docker中运行的java程序时遇到了很多痛苦 我在网上搜索 一些教程提出了像 spring dev tools 这样的工具 因为我的java程序是基于spring boo
  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐