av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

java語(yǔ)言

Java9的新特性

時(shí)間:2025-02-12 22:54:09 java語(yǔ)言 我要投稿
  • 相關(guān)推薦

Java9的新特性

  可能已經(jīng)聽說過 Java 9 的模塊系統(tǒng),但是這個(gè)新版本還有許多其它的更新。下面是小編分享的Java9的新特性,一起來看一下吧。

  1. Java 平臺(tái)級(jí)模塊系統(tǒng)

  Java 9 的定義功能是一套全新的模塊系統(tǒng)。當(dāng)代碼庫(kù)越來越大,創(chuàng)建復(fù)雜,盤根錯(cuò)節(jié)的“意大利面條式代碼”的幾率呈指數(shù)級(jí)的增長(zhǎng)。這時(shí)候就得面對(duì)兩個(gè)基礎(chǔ)的問題: 很難真正地對(duì)代碼進(jìn)行封裝, 而系統(tǒng)并沒有對(duì)不同部分(也就是 JAR 文件)之間的依賴關(guān)系有個(gè)明確的概念。每一個(gè)公共類都可以被類路徑之下任何其它的公共類所訪問到, 這樣就會(huì)導(dǎo)致無意中使用了并不想被公開訪問的 API。此外,類路徑本身也存在問題: 你怎么知曉所有需要的 JAR 都已經(jīng)有了, 或者是不是會(huì)有重復(fù)的項(xiàng)呢? 模塊系統(tǒng)把這倆個(gè)問題都給解決了。

  模塊化的 JAR 文件都包含一個(gè)額外的模塊描述器。在這個(gè)模塊描述器中, 對(duì)其它模塊的依賴是通過 “requires”  來表示的。另外, “exports” 語(yǔ)句控制著哪些包是可以被其它模塊訪問到的。所有不被導(dǎo)出的包默認(rèn)都封裝在模塊的里面。如下是一個(gè)模塊描述器的示例,存在于 “module-info.java” 文件中:

  module blog {

  exports com.pluralsight.blog;

  requires cms;

  }

  我們可以如下展示模塊:

  請(qǐng)注意,兩個(gè)模塊都包含封裝的包,因?yàn)樗鼈儧]有被導(dǎo)出(使用橙色盾牌可視化)。 沒有人會(huì)偶然地使用來自這些包中的類。Java 平臺(tái)本身也使用自己的模塊系統(tǒng)進(jìn)行了模塊化。通過封裝 JDK 的內(nèi)部類,平臺(tái)更安全,持續(xù)改進(jìn)也更容易。

  當(dāng)啟動(dòng)一個(gè)模塊化應(yīng)用時(shí), JVM 會(huì)驗(yàn)證是否所有的模塊都能使用,這基于 `requires` 語(yǔ)句——比脆弱的類路徑邁進(jìn)了一大步。模塊允許你更好地強(qiáng)制結(jié)構(gòu)化封裝你的應(yīng)用并明確依賴。你可以在這個(gè)課程中學(xué)習(xí)更多關(guān)于 Java 9 中模塊工作的信息 。

  2. Linking

  當(dāng)你使用具有顯式依賴關(guān)系的模塊和模塊化的 JDK 時(shí),新的可能性出現(xiàn)了。你的應(yīng)用程序模塊現(xiàn)在將聲明其對(duì)其他應(yīng)用程序模塊的依賴以及對(duì)其所使用的 JDK 模塊的依賴。為什么不使用這些信息創(chuàng)建一個(gè)最小的運(yùn)行時(shí)環(huán)境,其中只包含運(yùn)行應(yīng)用程序所需的那些模塊呢? 這可以通過 Java 9 中的新的 jlink 工具實(shí)現(xiàn)。你可以創(chuàng)建針對(duì)應(yīng)用程序進(jìn)行優(yōu)化的最小運(yùn)行時(shí)映像而不需要使用完全加載 JDK 安裝版本。

  3. JShell: 交互式 Java REPL

  許多語(yǔ)言已經(jīng)具有交互式編程環(huán)境,Java 現(xiàn)在加入了這個(gè)俱樂部。您可以從控制臺(tái)啟動(dòng) jshell ,并直接啟動(dòng)輸入和執(zhí)行 Java 代碼。 jshell 的即時(shí)反饋使它成為探索 API 和嘗試語(yǔ)言特性的好工具。

  測(cè)試一個(gè) Java 正則表達(dá)式是一個(gè)很好的說明 jshell 如何使您的生活更輕松的例子。 交互式 shell 還可以提供良好的教學(xué)環(huán)境以及提高生產(chǎn)力,您可以在此了解更多信息。在教人們?nèi)绾尉帉?Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話。

  4. 改進(jìn)的 Javadoc

  有時(shí)一些小事情可以帶來很大的不同。你是否就像我一樣在一直使用 Google 來查找正確的 Javadoc 頁(yè)面呢? 這不再需要了。Javadoc 現(xiàn)在支持在 API 文檔中的進(jìn)行搜索。另外,Javadoc 的輸出現(xiàn)在符合兼容 HTML5 標(biāo)準(zhǔn)。此外,你會(huì)注意到,每個(gè) Javadoc 頁(yè)面都包含有關(guān) JDK 模塊類或接口來源的信息。

  5. 集合工廠方法

  通常,您希望在代碼中創(chuàng)建一個(gè)集合(例如,List 或 Set ),并直接用一些元素填充它。 實(shí)例化集合,幾個(gè) “add” 調(diào)用,使得代碼重復(fù)。 Java 9,添加了幾種集合工廠方法:

  Set<Integer> ints = Set.of(1, 2, 3);

  List<String> strings = List.of("first", "second");

  除了更短和更好閱讀之外,這些方法也可以避免您選擇特定的集合實(shí)現(xiàn)。 事實(shí)上,從工廠方法返回已放入數(shù)個(gè)元素的集合實(shí)現(xiàn)是高度優(yōu)化的。這是可能的,因?yàn)樗鼈兪遣豢勺兊模涸趧?chuàng)建后,繼續(xù)添加元素到這些集合會(huì)導(dǎo)致 “UnsupportedOperationException” 。

  6. 改進(jìn)的 Stream API

  長(zhǎng)期以來,Stream API 都是 Java 標(biāo)準(zhǔn)庫(kù)最好的改進(jìn)之一。通過這套 API 可以在集合上建立用于轉(zhuǎn)換的申明管道。在 Java 9 中它會(huì)變得更好。Stream 接口中添加了 4 個(gè)新的方法:dropWhile, takeWhile, ofNullable。還有個(gè) iterate 方法的新重載方法,可以讓你提供一個(gè) Predicate (判斷條件)來指定什么時(shí)候結(jié)束迭代:

  IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

  第二個(gè)參數(shù)是一個(gè) Lambda,它會(huì)在當(dāng)前 IntStream 中的元素到達(dá) 100 的時(shí)候返回 true。因此這個(gè)簡(jiǎn)單的示例是向控制臺(tái)打印 1 到 99。

  除了對(duì) Stream 本身的擴(kuò)展,Optional 和 Stream 之間的結(jié)合也得到了改進(jìn)。現(xiàn)在可以通過 Optional 的新方法 `stram` 將一個(gè) Optional 對(duì)象轉(zhuǎn)換為一個(gè)(可能是空的) Stream 對(duì)象:

  Stream<Integer> s = Optional.of(1).stream();

  在組合復(fù)雜的 Stream 管道時(shí),將 Optional 轉(zhuǎn)換為 Stream 非常有用。

  7. 私有接口方法

  Java 8 為我們帶來了接口的默認(rèn)方法。 接口現(xiàn)在也可以包含行為,而不僅僅是方法簽名。 但是,如果在接口上有幾個(gè)默認(rèn)方法,代碼幾乎相同,會(huì)發(fā)生什么情況? 通常,您將重構(gòu)這些方法,調(diào)用一個(gè)可復(fù)用的私有方法。 但默認(rèn)方法不能是私有的。 將復(fù)用代碼創(chuàng)建為一個(gè)默認(rèn)方法不是一個(gè)解決方案,因?yàn)樵撦o助方法會(huì)成為公共API的一部分。 使用 Java 9,您可以向接口添加私有輔助方法來解決此問題:

  public interface MyInterface {

  void normalInterfaceMethod();

  default void interfaceMethodWithDefault() {  init(); }

  default void anotherDefaultMethod() { init(); }

  // This method is not part of the public API exposed by MyInterface

  private void init() { System.out.println("Initializing"); }

  }

  如果您使用默認(rèn)方法開發(fā) API ,那么私有接口方法可能有助于構(gòu)建其實(shí)現(xiàn)。

  8. HTTP/2

  Java 9 中有新的方式來處理 HTTP 調(diào)用。這個(gè)遲到的特性用于代替老舊的 `HttpURLConnection` API,并提供對(duì) WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模塊交付。也就是說,這套 API 不能保證 100% 完成。不過你可以在 Java 9 中開始使用這套 API:

  HttpClient client = HttpClient.newHttpClient();

  HttpRequest req =

  HttpRequest.newBuilder(URI.create("http://www.google.com"))

  .header("User-Agent","Java")

  .GET()

  .build();

  HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());

  除了這個(gè)簡(jiǎn)單的請(qǐng)求/響應(yīng)模型之外,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性,比如流和服務(wù)端推送。

  9. 多版本兼容 JAR

  我們最后要來著重介紹的這個(gè)特性對(duì)于庫(kù)的維護(hù)者而言是個(gè)特別好的消息。當(dāng)一個(gè)新版本的 Java 出現(xiàn)的時(shí)候,你的庫(kù)用戶要花費(fèi)數(shù)年時(shí)間才會(huì)切換到這個(gè)新的版本。這就意味著庫(kù)得去向后兼容你想要支持的最老的 Java 版本 (許多情況下就是 Java 6 或者 7)。這實(shí)際上意味著未來的很長(zhǎng)一段時(shí)間,你都不能在庫(kù)中運(yùn)用 Java 9 所提供的新特性。幸運(yùn)的是,多版本兼容 JAR 功能能讓你創(chuàng)建僅在特定版本的 Java 環(huán)境中運(yùn)行庫(kù)程序時(shí)選擇使用的 class 版本:

  multirelease.jar

  ├── META-INF

  │   └── versions

  │       └── 9

  │           └── multirelease

  │               └── Helper.class

  ├── multirelease

  ├── Helper.class

  └── Main.class

  在上述場(chǎng)景中, multirelease.jar 可以在 Java 9 中使用, 不過 Helper 這個(gè)類使用的不是頂層的 multirelease.Helper 這個(gè) class, 而是處在“META-INF/versions/9”下面的這個(gè)。這是特別為 Java 9 準(zhǔn)備的 class 版本,可以運(yùn)用 Java 9 所提供的特性和庫(kù)。同時(shí),在早期的 Java 諸版本中使用這個(gè) JAR 也是能運(yùn)行的,因?yàn)檩^老版本的 Java 只會(huì)看到頂層的這個(gè) Helper 類。


[Java9的新特性]相關(guān)文章:

1.JDK6.0的新特性:輕量級(jí)Http Server

2.詳解JAVA8的10大新特性

【Java9的新特性】相關(guān)文章:

HTML5新特性介紹06-28

詳解JAVA8的10大新特性07-09

JDK6.0的新特性:輕量級(jí)Http Server09-08

PHP7的五大新特性有哪些08-11

Win10系統(tǒng)預(yù)覽版有什么新特性201709-30

《聲音的特性》教學(xué)設(shè)計(jì)11-01

Java語(yǔ)法的主要特性05-24

c語(yǔ)言課程的特性11-09

Java中數(shù)組的特性09-18