Java参数验证,File存在,可以读取并且是常规文件

时间:2012-08-04 22:24:38

标签: java validation

我有这个代码来验证java.io.File参数,该参数不应该是null,应该是可访问的,应该是文件而不是目录等等:

private static final String EXCEPTION_FILE_CAN_NOT_BE_READ =
    "The file %s does not seem to readable.";
private static final String EXCEPTION_PATH_DOES_NOT_EXIST =
    "The path %s does not seem to exist.";
private static final String EXCEPTION_PATH_IS_NOT_A_FILE =
    "The path %s does not seem to correspond to a file.";
private static final String EXCEPTION_PATH_REFERENCE_IS_NULL =
    "The supplied java.io.File path reference can not be null.";

public static Banana fromConfigurationFile(
    File configurationFile) {
  if (configurationFile == null) {
    String nullPointerExceptionMessage =
        String.format(EXCEPTION_PATH_REFERENCE_IS_NULL, configurationFile);
    throw new NullPointerException();
  }
  if (!configurationFile.exists()) {
    String illegalArgumentExceptionMessage =
        String.format(EXCEPTION_PATH_DOES_NOT_EXIST,
            configurationFile.getAbsolutePath());
    throw new IllegalArgumentException(illegalArgumentExceptionMessage);
  }
  if (!configurationFile.isFile()) {
    String illegalArgumentExceptionMessage =
        String.format(EXCEPTION_PATH_IS_NOT_A_FILE,
            configurationFile.getAbsolutePath());
    throw new IllegalArgumentException(illegalArgumentExceptionMessage);
  }
  if (!configurationFile.canRead()) {
    String illegalArgumentExceptionMessage =
        String.format(EXCEPTION_FILE_CAN_NOT_BE_READ,
            configurationFile.getAbsolutePath());
    throw new IllegalArgumentException(illegalArgumentExceptionMessage);
  }
  // ... more tests, like "isEncoding(X)", "isBanana(ripe)", ...
}

看起来很像我可以从某个地方“捏”的样板。特别是因为这些并不是我需要的所有检查,还有更多(例如文件是文本文件并具有正确的编码,......)。对我而言,似乎有一种比这更简单的方法。也许是通过Builder构建并传递给verifyFileSpecs静态助手的FileSpecs对象?

问题:我做错了还是我可以重复使用的代码?

回答有效期的常见问题:

显示我事先做了一些研究:我查看了Java 6 SDK,我从中获得了不同的方法,查看了JDK 7和Files.isReadable,查看了Apache Commons IO,......

显示这个问题是唯一的:我特别询问是否有可以重复使用的代码,我不是在问“我如何检查路径是否与文件对应而不是目录?”,所有这些都有已经回答了SO

为什么这对其他人有用:团队不喜欢像代码审查,签入和版本化,可能维护(单元测试等)提交的样板代码。因此,从信誉良好的来源借用代码将在我看来,非常有帮助。

1 个答案:

答案 0 :(得分:2)

是的,我会说上面的代码不是DRY (Don't Repeat Yourself)

考虑使用Apache Commons的Validate

public static Banana fromConfigurationFile(File configurationFile) {
  Validate.notNull(configurationFile, String.format(EXCEPTION_PATH_REFERENCE_IS_NULL, configurationFile));
  Validate.isTrue(configurationFile.exists(), String.format(EXCEPTION_PATH_DOES_NOT_EXIST, configurationFile.getAbsolutePath()));
  Validate.isTrue(configurationFile.isFile()), String.format(EXCEPTION_PATH_IS_NOT_A_FILE, configurationFile.getAbsolutePath()));
  // and more validation...

}