2013-05-08 165 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()方法獲得的。