2013-05-08 139 views
4

路径和路径之间的交互似乎很简单。你使用Paths'get()方法得到一个Path对象。然后,您可以使用Path的方法:在Java中使用路径和路径

Path p = Paths.get("C:\\directory\\filename.txt"); 
p.getFilename(); 
p.getRoot(); 
p.getParent(); 
etc... 

什么是困惑我的是,Java文档描述了路径为接口的事实。通常情况下,接口只是方法签名的集合,您需要在任何类中声明它通过implements关键字使用它。

但是,在Path的情况下,没有使用“implements”关键字,并且您没有实现这些方法。他们已经预定义。

我明显得到了棍棒某个地方的错误结局。有人能解释我误解了什么吗?

回答

5

这是OOP substituion原则http://en.wikipedia.org/wiki/Liskov_substitution_principle

If S is a T, then references to T can be changed to references to S 

在我们的情况下,它意味着路径可以返回一个实现路径中的任何类的一个实例。如果我打印实际的类名

System.out.println(p.getClass()); 

我会得到

class sun.nio.fs.WindowsPath 

正如你可以看到这是Windows特定路径实现。当然,在Linux上我们会得到不同的东西。使用静态工厂方法返回接口允许此方法更改此接口的实际实现。

1

Path是一个接口。选择代码中某处的对象,然后按F4键以获取类型层次结构。这会告诉你实际的实现。你会看到这一点:

Path 
- AbstractPath 
    - WindowPath 
- ZipPath 

Paths是一个具体的实现提供了一个Path通过Paths.get(filename)返回服务。 Paths类将实例化您可以在类型层次结构中看到的具体实现之一。这里最好的做法是返回最常用的类型Path。因此,您自己的实现独立于底层实现Path,它可能是WindowPathZipPath

0

Path是一个接口,Paths.get()是生产具体实现的工厂方法。

返回的确切具体类将取决于您的操作系统和文件系统类型。

1
Paths.get("C:\\directory\\filename.txt"); 

返回所得Path实现对象(基于OS)。该路径是通过调用默认FileSystemgetPath()方法获得的。