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

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐