java8之lambda表達式(接口中的靜態方法)
在Java8中,你可以為接口添加靜態方法。從技術角度來說,這是完全合法的。只是它看起來違反了接口作為一個抽象定義的理念。
至今為止, 我們經常在相互一起使用的類中使用靜態方法。你可以在標準庫中找到像Collection/Collections或者Path/Paths這樣成對的接口和類。以Paths類為例,它只有一些工廠方法。你可以通過一組字符串來構造一個路徑,例如Paths.get("jdk1.8.0","jre","bin")。在java8中,Path接口中添加了這樣一個方法:
public interface Path{ public static Path get(String first,String... more){ return FileSystems.getDefault().getPath(first,more); } .... }
這樣Paths類就再沒有存在的必要了。
當你查看Coolections類時,你會發現兩種方法,一種如下所示:
public static void shuffle(List<?> list)
這類方法可以作為List接口中的一個默認方法:
public default void shuffle();
然后你只需要在任何list對象上調用list.shuffle()。
但是這樣無法適用于靜態的工廠方法,因為你沒有可用的對象來調用該方法。因此,java8中引入了靜態接口方法。例如:
public static <T> List<T> nCopies(int n,T o) //構造含有n個T類型實例的列表
它可以作為List接口的一個靜態方法。這樣你就可以調用List.nCopies(10,"Fred"),而不是Collections.nCopies(10,"Fred"),就能夠更清楚地表示返回的結果是一個List對象。
雖然Java的集合類不太可能像這樣進行重構,但是當你實現自己的庫時,不必再為工具方法提供一個輔助的類了。在Java8中,很多接口中已經添加了靜態方法。
來自:http://my.oschina.net/fhd/blog/420468
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!