2010-04-04 75 views
0

当调整返回true/false的C风格函数到Java时,最佳实践是什么?调整返回true/false的方法

下面是一个简单的方法来说明问题所在。

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

请注意,有可能是一种更优雅的过滤文件的方式(随意对此进行评论)。无论如何,如果文件名是null值,是否有:

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

见http://stackoverflow.com/questions/135845/are-booleans-as-method-arguments-unacceptable/135871#135871一个可能的选项(4) – skaffman 2010-04-04 21:54:35

+0

谢谢skaffman。 – 2010-04-04 23:10:30

回答

7

如果文件名为空,则应该抛出NullPointerException或IllegalArgumentException。我会让你决定哪一个最好。有一个很好的辩论在这个问题上使用:IllegalArgumentException or NullPointerException for a null parameter?

+1

+1当然,如果你只是保持原样,你将会得到一个合适的'NullPointerException';我可能不会再打扰了。选项1和选项2是可怕的,因为它们会将错误推迟到稍后可能难以调试的点。 – bobince 2010-04-04 22:20:43

+1

关于NPE与IAE:我会推荐NPE,因为它通过标准库被广泛使用来表明参数是非法'null'。 Java 7甚至会引入'java.util.Objects',它将具有用于单行反空检查和赋值的实用程序方法(如果参数为空,则提供NPE)。 NPE已经成为实现这一目标的方式。相关的RFE:http://bugs.sun.com/view_bug.do?bug_id=6889858 – gustafc 2010-04-04 22:55:11

+0

很高兴听到。这将节省一个实用方法来检查空值。 – 2010-04-04 23:24:23

3

你做什么,在你的特定应用程序的问题域是有道理的:

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

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

2

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

返回可为空的布尔值通常会导致比他们的值更多的麻烦,您检查是否有空值等。除了fileNameEndsWithExtension()看起来像只在知道您具有有效文件名时才会使用的函数。

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

1
  1. 返回true IFF文件名。endsWith(fileExtension)

如果文件名为空,并且不打扰null和任何其他非匹配值之间的区别,我会返回false。

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

我选择null = false行为的原因可能是由于关系数据库的影响。以下查询将只返回符合条件的行,其他所有内容(空值和不匹配)将被忽略。

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

我明白这是我以前习惯的理由。顺便说一句,带有JQL/JPA/Hibernate的getResult()也会返回一个空值(通常分配给一个List)。 – 2010-04-04 23:23:02