在原始返回类型函数上返回“null”?

时间:2010-07-22 19:44:15

标签: java

我有一个函数,它返回给定键的int值(来自HashMap<String, Integer>)。如果密钥不存在,我想返回调用者可以检查的内容。看来,最常见的情况是,这将是“返回-1,如果密钥不存在”的那种东西。但是,在我的情况下,我不能为此目的保留-1,因为负数是存在的键的可行值。

我能够提出的唯一其他选择如下:

  1. 将返回类型更改为Integer包装器类并检查null
  2. 返回一些非常不可能的内容,例如Integer.MIN_VALUE
  3. 制作一个应始终首先调用的boolean keyExists(String key)函数
  4. 切换为float并使用NaN代替
  5. 我是用Java编写的,但欢迎来自相似语言背景的人发帖。谢谢!

8 个答案:

答案 0 :(得分:14)

在我看来,第一个选择是最干净的。像-1和Integer.MIN_VALUE这样的幻数有点混乱,尤其是当值不直观时。这是一个惯用的C解决方案,Java开发人员会讨厌你。根据您实际使用的内容,如果仅在“异常”情况下发生这种情况,您也可以抛出“KeyNotFoundException”。

答案 1 :(得分:3)

我投票支持在这里抛出一个检查过的例外。一般来说,我不喜欢检查过的异常,但在这种情况下,这似乎是合理的。不存在该值的情况将需要与存在该值的情况分开处理,使用异常将使其清楚。

实际上,添加keyExists方法的想法是您列出的最佳想法,因为它不依赖于用户知道寻找特殊值。如果你这样做那么你可以抛出异常作为备份计划,以防地图内容在对keyExists的调用和检索之间发生变化。

答案 2 :(得分:1)

虽然它在很大程度上取决于应用程序并且知道约束,但我更喜欢上面的#1。原因是因为它是显而易见的 - 根据我的经验,拥有一个明确的情况总是比隐含的更好 - 比如MIN_VALUE。

另一种选择是让包装器对象包含结果值作为基本int,但也具有状态值或类似的东西。所以它可能是这样的:

public class Wrapper {
    private int value = Integer.MIN_VALUE;
    private boolean isValid;
    // appropriate getters and setters etc.
}

根据问题的复杂程度,您还可以包含枚举而不是布尔值来替换状态。如果您看到此元素包含复合信息 - 单键键控的信息集或类似的东西 - 容器对象或状态对象在这些情况下非常有价值。

答案 3 :(得分:1)

float是不安全的,因为并非所有int值都可以准确地表示为int值。 long是一个更好的选项,因为所有int值都可以安全存储,并且你会有更多的值找不到。

如果您正在使用Map,那么您还有一个Integer对象,所以为什么不返回它(或null)

如果你真的想使用原语(为了效率?),我建议你改为TObjectIntHashMap。这使用原始int值。要检查absense,你必须单独检查containsKey()。

答案 4 :(得分:1)

两种情况是典型的:

  1. 你有很高的期望 找到特定的价值 键。
  2. 您不确定是否有特定的密钥 存储了一个值。
  3. 如果假设1错误,则可能表示存在错误,因此请使用断言保护您在访问方法中的假设。

    如果2适用,您如何确定返回的内容?所以提供一个测试方法,如“keyExists”,并在访问地图之前绝对知道。

    在案例1中,不需要检查,这更加清晰,但如果您错了,访问将失败。 对于特殊情况,例如-1或Integer.MIN_VALUE,很难确定它们是否会被使用。

    像Haskell,Scala和C#这样的语言有特殊的类型来传达一个值的存在/缺失,这比使用null要好得多(如果你忘记测试你可能会得到一个NullPointerException)

答案 5 :(得分:0)

选项5:抛出异常

虽然在这种情况下,我会投票使用Integer类。

答案 6 :(得分:0)

我认为你应该结合选项#1和#3,因为这与底层HashMap的行为一致。来自HashMap的get method documentation

  

返回指定键在此标识哈希映射中映射到的值,如果映射不包含此键的映射,则返回null。返回值null不一定表示映射不包含键的映射;地图也可能显式地将键映射为null。 containsKey方法可用于区分这两种情况。

答案 7 :(得分:0)

  
      
  1. 将返回类型更改为Integer包装器类并检查是否为null。
  2.   

这是更常见的选择。