以下是实用方法的示例:
public static Long getFileSize(String fileString) {
File file = new File(fileString);
if (file == null || !file.isFile())
return null;
return file.length();
}
将String而不是File传递给这样的方法是一种好习惯吗?一般来说,在制作这种风格的实用方法时应该采用什么推理?
答案 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)
有许多注意事项:
存在减少应用中重复锅炉板代码量的实用方法,从而使代码更具可读性并减少潜在错误的数量。适合最常见的使用模式是有意义的,即如果大多数时候你有一个描述文件的字符串 - 传递字符串。大多数好处来自于首先使用实用方法,而不是获得100%面向未来的最佳签名。
传递文件而不是字符串可以提供更强的输入,也就是说,可以在编译时检查更多代码,以防止打字错误。让编译器为您完成工作,使用强类型的好处。
传递文件意味着您可以传递任何类型的File对象,可能是定制的内存中文件对象,而无需更改实用程序方法来处理定制的文件描述符。
当您需要处理大量的OS文件路径时,传递一个字符串会有所帮助,而您只想用最少的行数检查大小。
最后,您可以以非常低的成本获得多种重载实用程序方法。这种情况正是存在方法重载作为语言特征的原因。看看代码库中自然有用的东西。代码是可塑的,这不是您必须永远忍受的这些设计决策之一,除非您正在构建供其他人使用的API。
您可能还希望将名称更改为更具描述性的名称,例如
最初使用约定suggested by Joel Spolsky。
答案 7 :(得分:1)
方法在这种情况下,重载是最佳实践。
答案 8 :(得分:0)
唯一重要的是你将如何使用这种方法。换句话说,如果您的应用程序使用File对象操作,您可以传递它们并删除一些不必要的操作。如果使用文件路径,字符串参数可能更方便。
但最终,两种选择都没有错:两者都不会使你的应用程序更糟糕。