实用方法 - 传递文件或字符串?

时间:2010-05-09 00:18:41

标签: java utility-method

以下是实用方法的示例:

public static Long getFileSize(String fileString) {

    File file = new File(fileString);

    if (file == null || !file.isFile())
        return null;

    return file.length();
}

将String而不是File传递给这样的方法是一种好习惯吗?一般来说,在制作这种风格的实用方法时应该采用什么推理?

9 个答案:

答案 0 :(得分:3)

这是我首选的解决方案:

public static Long getFileSize(String path) {
    return getFileSize(new File(path));
}

public static Long getFileSize(File file) {
    return (!file.isFile()) ? -1L : file.length();
}

请注意,它返回-1L而不是0L,以允许调用者区分空文件和由于某种原因无法确定长度的“文件”。在您没有零长度文件的某些情况下,file.length()将返回零; e.g。

  • file不存在时
  • file是目录
  • file是特殊文件(例如设备文件,管道等)时,操作系统无法确定其长度。

file.isFile()来电处理这些案件。但是,方法是否应该返回-1L或抛出异常是有争议的。这场辩论的答案取决于-1L案例是“正常”还是“例外”,而且只能参考设法使用该方法的背景来确定,

答案 1 :(得分:2)

我选择文件。对我来说感觉有点OOP:更多类型安全(字符串在Java中是如此'通用'...)和语义表达:如果你正在处理文件,那么传递一个File对象。

回想一下,在Java中, File 对象本身并不代表文件(其内容),而是代表其路径:“ An abstract representation of file and directory pathnames < / em>“(它甚至可以是不存在的文件的路径),这几乎就是你需要的。

这只能是少数情况下的限制:如果“文件”实际上是某种伪文件或资源,例如在jar文件中。我发现有用的替代方案是URI,它(概念上)包含文件作为特例,但也包括其他资源。

如果您决定坚持使用两个备选方案(字符串或文件),我强烈建议不要将方法命名为相同。 Method overloading can be a pain,只有在它为您带来实实在在的好处时才使用它。

答案 2 :(得分:1)

我认为这将取决于您将要调用此方法时可用的内容。如果你有文件名(String),但没有文件,那么让调用者从文件名创建文件似乎没什么意义。

当我不确定时,我的方法是创建两个方法,一个用于String,一个用于File。然后让String one创建文件并调用文件。

public static long getFileSize (final String fileString) {
  return getFileSIze (new File (fileString)); 
}

public static long getFileSize (File file) {
   if (file == null || !file.isFile()) return null;
   return file.length();
}

答案 3 :(得分:1)

这取决于客户端预期的效用。如果客户端已经有文件对象并且想要获取文件大小,则客户端开发人员被迫提取文件路径并将其传递给实用程序方法。为了避免它,我将提供重载方法1)文件2)文件路径字符串

另外,如果文件不可用,我会抛出异常而不是返回null。

答案 4 :(得分:1)

我的建议是同时拥有:

public static Long getFileSize(String path) {
    return getFileSize(new File(path));
}

public static Long getFileSize(File file) {
    return (file == null || !file.isFile()) ? 0L : file.length();
}

让您的用户根据他们用来表示文件系统路径的对象类型进行选择。正如@Nikita所说,两种选择都不对。

答案 5 :(得分:1)

在我看来,该函数仅对字符串参数有用。它做了什么?

  • 它会创建一个文件对象。
  • 检查是否可以创建。
  • 检查是否为文件
  • 返回长度

如果您传递了一个文件,则首先不需要,可能会假定接下来的两个,并且长度是文件成员函数。如果你传递一个文件,这个函数变得太简单了,不能写:)

(另外,我认为从返回long的函数返回null很奇怪)

如果您已有File对象,请使用:

length = file.isFile() ? file.length() : -1;

如果您的代码处理文件而不是文件名,那么如果您重复使用文件指针,则可以自行保存一些文件。在这种情况下,它可能会导致您通过文件名方法使用它们。

答案 6 :(得分:1)

有许多注意事项:

  1. 存在减少应用中重复锅炉板代码量的实用方法,从而使代码更具可读性并减少潜在错误的数量。适合最常见的使用模式是有意义的,即如果大多数时候你有一个描述文件的字符串 - 传递字符串。大多数好处来自于首先使用实用方法,而不是获得100%面向未来的最佳签名。

  2. 传递文件而不是字符串可以提供更强的输入,也就是说,可以在编译时检查更多代码,以防止打字错误。让编译器为您完成工作,使用强类型的好处。

  3. 传递文件意味着您可以传递任何类型的File对象,可能是定制的内存中文件对象,而无需更改实用程序方法来处理定制的文件描述符。

  4. 当您需要处理大量的OS文件路径时,传递一个字符串会有所帮助,而您只想用最少的行数检查大小。

  5. 最后,您可以以非常低的成本获得多种重载实用程序方法。这种情况正是存在方法重载作为语言特征的原因。看看代码库中自然有用的东西。代码是可塑的,这不是您必须永远忍受的这些设计决策之一,除非您正在构建供其他人使用的API。

  6. 您可能还希望将名称更改为更具描述性的名称,例如

    • long sizeFromFile(File f)
    • long sizeFromFileName(String name)

    最初使用约定suggested by Joel Spolsky

答案 7 :(得分:1)

方法在这种情况下,重载是最佳实践。

答案 8 :(得分:0)

唯一重要的是你将如何使用这种方法。换句话说,如果您的应用程序使用File对象操作,您可以传递它们并删除一些不必要的操作。如果使用文件路径,字符串参数可能更方便。

但最终,两种选择都没有错:两者都不会使你的应用程序更糟糕。