【问题标题】:Adapting methods which return true/false调整返回真/假的方法
【发布时间】:2011-02-04 06:45:21
【问题描述】:

在将返回真/假的 C 风格函数改编为 Java 时,最佳实践是什么?

这里有一个简单的方法来说明问题所在。

public static boolean fileNameEndsWithExtension( String filename, String fileExtension)  { 
    return filename.endsWith( fileExtension );
}

请注意,可能有一种更优雅的文件过滤方式(请随时对此发表评论)。无论如何,如果文件名是 null 值,请执行以下操作:

  1. 如果文件名为空,则返回 false?如果是这样,如何区分文件名为 null 的情况和 String 或文件名不以给定文件扩展名结尾的情况?
  2. 将返回类型更改为允许null 值的包装类布尔值。
  3. 抛出Exception 并强制程序员确保永远不会将null 值传递给方法?
  4. 使用其他解决方案?

【问题讨论】:

标签: java methods boolean


【解决方案1】:

如果文件名为空,您应该抛出 NullPointerException 或 IllegalArgumentException。我会让你决定哪个是最好的。关于在问题中使用哪个进行了很好的辩论:IllegalArgumentException or NullPointerException for a null parameter?

【讨论】:

  • +1 当然,如果你保持原样,你已经得到了一个合适的NullPointerException;我可能不会再打扰了。选项 1 和 2 很糟糕,因为它们会将错误推迟到以后可能更难调试的时候。
  • 关于 NPE 与 IAE:我会推荐 NPE,因为它通过标准库被广泛用于表示参数非法 null。 Java 7 甚至会引入java.util.Objects,它将具有用于单行反空检查和赋值的实用方法(如果参数为空,则给出 NPE)。 NPE 已成为实现此目的的方式。相关RFE:bugs.sun.com/view_bug.do?bug_id=6889858
  • 很高兴听到这个消息。它会省去一个实用方法来检查空值。
【解决方案2】:

您在特定应用程序的问题域中做有意义的事情:

  1. 如果说空文件名集以任何扩展名结尾是有意义的,则返回 true。
  2. 如果说空的文件名集以没有扩展名结尾是有意义的,则返回 false。
  3. 如果说没有人应该问这个问题是有道理的,那就让代码抛出。
  4. 如果有一个三值结果是有意义的,当然,使用布尔值。
  5. 或者创建一个三值枚举并从它返回。

大多数情况下,选项 3 是明智的,但这里没有人可以排除其他选项对您的应用程序的适用性。如果您出于充分的理由传递了许多有意义的空文件名,那么选择其他一个可能是有意义的。

【讨论】:

    【解决方案3】:

    我会使用 1 或 3。最好我会抛出 NullPointerExceptions 或至少使用 assert

    返回可为空的布尔值通常会导致比其价值更多的麻烦,您需要检查空值等。此外,fileNameEndsWithExtension() 看起来像一个函数,只有在您知道您有一个有效的文件名时才会使用它。

    另外不要忘记fileExtension 也可能是空值。

    【讨论】:

      【解决方案4】:
      1. 返回真 IFF filename.endsWith(fileExtension)

      如果文件名为 null,我将返回 false,并且不关心 null 和任何其他不匹配值之间的区别。

      如果空文件名是需要特别验证和处理的不同状态,那么这应该单独验证,最好在检查endsWith()之前,但仍然保留在endsWith()中的空检查,以防止不必要的运行时异常。

      我之所以会选择null = false的行为,可能是受到关系数据库的影响。以下查询将仅返回与条件匹配的行,其他所有内容(空值和不匹配)都将被忽略。

      select * from filenames
       where filename like '&fileExtension';
      

      【讨论】:

      • 我理解其中的原因,因为这是我以前习惯的。顺便说一句,带有 JQL/JPA/Hibernate 的 getResult() 也会返回一个空值(通常分配给一个列表)。
      猜你喜欢
      • 2011-05-18
      • 2011-05-11
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多