Me唱歌看書研究,程式小說新詩。搞了個Blog和古文網站,寫些亂七八糟及翻譯文章,玩些小程式和中文化。可惜時間美好人生苦短,沒法一一盡善。夢想是開間小 pub,放喜歡的音樂,喝自己調的酒。

noIE.png 針對 css 支援極差的 IE 可能會無法正常瀏覽本站,強烈建議 Mozilla Firefox

本站連結圖示與 Feed:
rss.gif atom10.gif
smalllogo.png

支援標準:
xhtml10validated.gif cssvalidated.gif
rss_valid.gif atom_valid.gif

本站架構:
firefox.png thunderbird.gif
openoffice.png postgresql.gif
spring.png ubuntu_button.gif

網路運動:
Sticker Map GeoUrl
Fight Spam!

本站授權規範:
cc.gif
Creative Commons License by-nc-sa
請參閱網頁下方之版權說明

Powered By Sylphie 0.1a

2011-08-29 03:02:35.976

Java SE 7 新功能與改進 - 1.3 Project Coin - try-with-resources 述句

try-with-resources 述句可以讓我們在 try 述句中宣告一到數項資源。當我們說某個物件是一項資源時,意味著該物件實作了 java.lang.AutoCloseable 或是它的子介面 java.lang.Closeable,並且當程式不再使用它們時,我們需要將其關閉。try 新增的述句確保每項資源在區段結束時都會被關閉。

早期我們都必須要自行處理資源的關閉,但現在我們可以藉助此一述句來簡化程式。下例會從檔案中讀取第一行,它使用 BufferedReader 物件來讀檔。BufferedReader 是一項資源,並且當程式不再使用它時,我們必須將其關閉:

本例中我們用新的 try 語法來宣告了一個 BufferedReader 資源,此語句必須接在 try 關鍵字之後,並且用圓括號 () 包起來。BufferedReader 在 Java SE 7 及其後版本裡,已實作了 java.lang.AutoCloseable 介面。因為 BufferedReader 實體是在 try-with-resource 述句中所宣告的,所以它將會被自動關閉;無論是 try 區塊正常結束,或是被突然中斷 (像是 BufferedReader.readLine 丟出 IOException)。

早期 Java 版本中,我們可以用 finally 區塊來確保資源被正確關閉 (不管 try 區塊是正常結束或是突然結束)。下例使用 finally 來替代 try-with-resources 述句:

然而在本例中,如果 readLineclose 方法同時丟出例外,則 readFirstLineFromFileWithFinallyBlock 方法最終丟出的是 finally 區塊中所產生的例外,而 try 區塊中產生的例外將會被抑制。相反地,在 readFirstLineFromFile 中,如果 try 區塊及 try-with-resources 述句中同時產生例外,則該方法最終丟出的將會是 try 區塊中所產生的例外,而不是 try-with-resources 述句中產生的例外。

也就是說,如果 readLineclose 方法同時丟出例外,則 readFirstLineFromFileWithFinallyBlock 方法會丟出由 close 方法所丟出的例外,並抑制 readLine 方法所丟出的例外;相反地 readFirstLineFromFile 方法會丟出由 readLine 方法所丟出的例外,並抑制 close 方法所丟出的例外。我們可以取得那些被抑制住的例外,細節請參考最後面的小節。

我們可以在 try-with-resources 述句中宣告一到多個資源。下例示範了如何從變數名為 zipFileName 的 ZIP 檔案中取得被壓縮的檔案名稱,並且建立一個包含這些檔案名稱的文字檔:

本例中 try-with-resources 述句宣告了兩個物件 ZipFileBufferedWriter,並且用分號 ; 分開。當此區塊程式碼運作結束時,無論是正常結束或例外發生,BufferedWriterZipFile 物件的 close 方法都會自動地依先後順序被呼叫。注意:呼叫所有資源 close 方法的順序和宣告它們的順序是相反的。

上面的程式片段在 finally 區段中的執行順序如下:

  1. rs.close();
  2. statement.close();
  3. conn.close();
  4. System.out.println("enter");
由此可知:
  1. 呼叫 close 方法的順序和宣告順序是相反的。
  2. 會先將所有資源都關閉後,才會正式進入 finally 區塊。
注意:try-with-resources 述句可以擁有 catchfinally 區塊,如同原本的 try 述句一樣。在 try-with-resources 述句中,會先將所有被宣告的資源關閉後,才會進入 catchfinally 區塊。

被抑制的例外

在上例 writeToFileZipFileContents 中,如果 try 區塊中產生了一個例外的話 (例如 write 方法),那麼 try-with-resources 述句中的其他例外全都會被抑制下來 (BufferedWriterZipFileclose 方法)。也就是說最後 writeToFileZipFileContents 方法丟出的是 try 區塊中的例外 (例如 write 方法)。如果我們想取得那些被抑制的例外的話,可以呼叫 Throwable.getSuppressed 方法。

實作了 AutoCloseableCloseable 介面的類別

請參考 AutoCloseableCloseable 介面的 JavaDoc,上面列出了所有已實作的類別。Closeable 介面繼承自 AuyoCloseable 介面。它們兩個的不同處在於:Closeable 介面的 close 方法會丟出 IOException 類型的例外,而 AutoCloseable 介面的 close 方法丟出的是 Exception 類型的例外。因此,AutoCloseable 介面的子類別可以覆寫 close 方法的行為來丟出特定的例外,像是 IOException,或是根本就不丟出任何例外。

2011-08-25 02:37:19.218

Java SE 7 新功能與改進 - 1.2 Project Coin - switch 指令支援字串

在 Java SE 7 中,可以在 switch 述句中使用 String 物件:

switch 述句會使用 String.equals 方法來比較每一個 case 標籤的字串物件,因此在 switch 述句中的字串比對是有大小寫分別的。

和一連串的 if-then-else 相比,在 switch 述句中使用字串會更有效率,並且容易閱讀。

2011-08-24 00:19:06.117

Java SE 7 新功能與改進 - 1.1 Project Coin - 二進位數字表示法

在 Java SE 7 中,整數型態 (byteshortintlong) 可以用二進位數字系統來表示,它的前置詞是 0b0B。下面列出幾個用法:

有的時候,數字用二進位法來表示,會比八或十六進位來得清楚和易讀。舉例來說:

原本在 Java 語言中可以使用整數數字的地方,都可以用二進位表示法:

你也可以用它來設計迷宮陣列,或是點陣圖形的表情符號,像是下面這個笑臉圖:

2011-08-03 15:01:14.424

Java SE 7 新功能與改進 - 0. 概觀

本系列將會介紹 Java SE 7 中的新功能和改進。首篇為概觀,其後的篇幅將會從本篇中挑出重要的部分加以詳細解說及示範。

注意:Java SE 7 中目前已發現 HotSpot 對迴圈最佳化後會在 server 模式下造成 bug。最好情況是 JVM crash (至少你知道程式掛了),最壞情況是迴圈不正確執行導致錯誤的結果 (程式繼續跑但內部資料爛掉了)。在 Java SE 6 中此功能預設是關閉的,但在 Java SE 7 預設開啟。目前不建議將 Java SE 7 使用在商業用途,請改用 Java SE 7 Update 2 或其後的版本。

附註:若必須使用 Java SE 7,又要避免上述錯誤發生的話,可以在啟動程式時加上 -XX:-UseLoopPredicate 參數,藉以避免 JVM 對迴圈做最佳化。(感謝 Hao Cheng Lee 提出)

Swing

JLayer 類別

JLayer 類別是一個靈活強大的 Swing 裝飾元件。它可以讓你在其他元件上描繪並回應元件事件,而無需直接地修改底層元件。更多訊息請參見 Java Tutorials 中的如何使用 JLayer 來裝飾元件

Nimbus 介面外觀

Nimbus 介面外觀 (Look & Feel) 已經從 com.sun.java.swing 搬到標準的 API 命名空間 javax.swing;請參見 javax.swing.plaf.nimbus。雖然它並不是預設的外觀,但你仍然可以很輕易地使用它。Java Tutorials 中的 Nimbus 介面外觀可取得更多資訊,以及在你的應用程式中用三種不同方式啟用 Nimbus 的範例。

重量級與輕量級元件

從前從前,在同一個容器中混合重量級 (AWT) 及輕量級 (Swing) 元件會造成問題。然而,在 Java SE 7 中已經可以很輕易地達到重量級和輕量級元件的混用。混用重量級與輕量級元件一文教你如何達成此目標。

多邊形及半透明視窗

Java SE 7 版本支援具透明度以及非矩形的視窗。請參見 Java Tutorials 中的如何建立半透明和多邊形視窗

JColorChooser 類別中使用 HSL 調色盤 (色調-飽和度-亮度)

HSV 分頁已加入 JColorChooser 類別裡,可允許使用者用 HSL 色彩模式來選擇顏色。

IO 及 NIO

java.nio.file 和與它相關的 java.nio.file.attribute 中提供了各式各樣的檔案 IO 支援,以及檔案系統存取。JDK 7 中同時也可找到 ZIP 檔案系統供應器。另外也包含了非同步的 IO 操作。下列資源提供了更多資訊:

網路

新增 URLClassLoader.close() 方法。此方法有效地解決了問題:如何支援更新過後的類別實作和資源,尤其是從特殊代碼庫中載入的,像是 JAR 檔。請參見關閉 URLClassLoader

Sockets Direct 協定 (SDP) 提供高效網路連線存取的能力。請參見 Java Tutorials 中的瞭解 Sockets Direct Protocol

安全性

橢圓曲線密碼學 (Elliptic Curve Cryptography,簡稱 ECC)

新的原生供應器已加進 Java SE 7 中,並提供數個以 ECC 為基礎的演算法 (ECDSA/ECDH)。請參見 Java PKCS#11 參考指南中的 Sun PKCS#11 供應器所支援的演算法

關閉 CertPath 演算法

現在可以關閉不牢固的加密演算法。例如,已不再被認為是安全的 MD2 摘要演算法。Java SE 7 提供一套機制來拒絕在憑證路徑處理和 TLS 握手連線中使用特定的演算法。請參見 Java PKI 程式設計師指南中的附錄 D: 關閉加密演算法,以及Java Secure Socket Extension (JSSE) 參考指南中的已關閉的加密演算法

JSSE (SSL/TLS)

TLS 1.1

SunJSSE 現在支援 RFC 4346 中的 TLS 1.1。最重要的更新是針對密碼字段鏈結 (Cipher block chaining,CBC) 攻擊的保護措施。

TLS 1.2

SunJSSE 現在支援 RFC 5246 中的 TLS 1.2。除此之外,它可指定不同的內部雜湊演算法、增加了新的密碼套件、並包含了改進過後的加密靈活度,尤其是商議加密演算法。

摒棄不堅固的密碼套件

像是 RFC 4346RFC 5246 以及 RFC 5469,有些密碼套件已經是過時且不應再被使用的。這些過時的套件在 SunJSSE 中已預設關閉。更多細節請查閱有關於 SunJSSE 供應器的文件中的密碼套件清單。

連線敏感的信託管理

現在信託管理者和金鑰管理者雙方都有能力檢驗 TLS 連線中的參數,明確地說是在握手階段時連線內的 SSLSession。例如,信託管理者可能會限制憑證的類型必須列在有效的簽名演算法清單中。

終端查驗

終端識別演算法可以被指定去查驗遠端電腦的主機位址需與其提供的憑證相符。此種查驗類型早先已加入 HTTPS 協定 (參見 HttpsURLConnectionHostnameVerifier),而現在它已經在 TLS 層級上列為可選項目。

TLS 重新商議

Java SE 支援 RFC 5746,它修正了 TLS 協定中一些重新商議的問題

預設關閉 SSLv2Hello

在 Java SE 7 中,SSLv2Hello 已從預設開啟的協定清單中移除。

關閉演算法

不堅固的加密演算法現在已可關閉,如同上述所說明的。

伺務器名稱指示 (Server Name Indication, 簡稱 SNI) 的 JSSE 客戶端

Java SE 7 支援在 JSSE 客戶端中的 SNI 擴展。SNI 請參見 RFC 4366。它可以讓 TLS 客戶端連線到虛擬伺服器上。

更牢固的 EncryptedPreMasterSecret 版本數量驗証

Java SE 7 限縮了在 TLS 1.1 及 TLS 1.2 握手階段中的版本數量驗證。請參見 JSSE 參考指南

並行工具

ForkJoinPool 類別為基礎的 fork/join 框架實作了 Executor 介面。它被設計成可有效地使用執行緒連線池來完成大量的任務。一種工作竊取 (work-stealing) 的技術可以讓所有的執行緒都處在忙碌的狀態,藉以達到多處理器的完整優勢。請參見 Java Tutorials 中的 Fork/Join。另外 <Java home>/sample/forkjoin/ 目錄下亦包含了 fork/join 框架的範例。

本地執行緒的偽亂數產生器 ThreadLocalRandom 類別使用偽亂數來消除執行緒之間的衝突。請參見並行隨機亂數

靈活且可複用的 Phaser 類別是新的同步關卡 (barrier),類似於 CyclicBarrier

新的傳輸佇列 TransferQueue 和並行性的雙向連結佇列 ConcurrentLinkedDeque

多樣化網際網路應用程式 (Rich Internet Applications,簡稱 RIA) 及部署

Java 2D

基於 XRender 的貼圖管線

現在基於 XRender 的新 Java 2D 貼圖管線已支援新式的 X11 桌面,提供加強過後的圖形效能,可存取大部份現今 GPU 的功能。此管線預設是關閉狀態,但可藉由設定命令列參數 -Dsun.java2d.xrender=true 來開啟。舊的 X11 組態可能無法支援 Xrender。詳盡格式 -Dsun.java2d.xrender=True 可發送一則訊息到標準輸出中,用來指出管線是否已實際啟動。請參見 Java 2D 技術中的系統變數中有關 xrender 部份。

支援 OpenType/CFF 字型

JDK 現在會列舉出並顯示已安裝的 OpenType/CFF 字型,藉由呼叫像是 GraphicsEnvironment.getAvailableFontFamilyNames() 之類的函式;這些字型同時也會被 Font.createFont() 方法識別出來。請參見 Java Tutorials 中的選擇字型

TextLayout 支援藏文字母表

TextLayout 支援藏文字母表。

支援 Linux 字型

對於 Solaris 及 Windows,JDK 的邏輯字型已在 fontconfig.properties 檔案中明確指定。而在其他各種不同的 Linux 實作品中,無法保証某特定的字型是否存在以支援特定的地區。自 Java SE 7 起,針對無法識別的 Linux 平台,可使用 libfontconfig 字型組態 API 來選擇該用何種字型去對應邏輯字型。請參見 Fontconfig

Java XML - JAXP, JAXB, and JAX-WS

JAXP

  • Java SE 7 現在包含了 Java API for XML Processing (JAXP) 1.4.5 版。
  • 和前一版比起來,有許多的臭蟲修正和一些改進,特別是一致性、安全性和效能。
  • 雖然規格仍是 JAXP 1.4,但是 StAX 已經依照 JSR 173 Maintenance Review 3 而升級到 StAX 1.2 版。
更多資訊請參考 JAXP 1.4.5 Release NotesJAXP 1.4.5 Change log

JAXB

Java SE 7 支援 Java Architecture for XML Binding (JAXB) 2.2.3 版。更多資訊請參考 JAXB Change log 中 JAXB RI 2.2 及更新版的部分。

JAX-WS

Java SE 7 支援 Java API for XML Web Services (JAX-WS) 2.2.4 版。更多資訊請參考 JAX-WS Change log 中 JAX-WS RI 2.2 及更新版的部份。

國際化

Unicode 6.0.0 中新的字碼表和字元

Java SE 7 的早期版本中加入了 Unicode 5.1.0 的支援,而 Java SE 7 的最終版本支援 Unicode 6.0.0。Unicode 6.0.0 是 Unicode 標準的主要版本,不但支援了兩千個以上的額外字元,而且也新增了屬性和資料檔案。

Java Tutorials 中有新的一節討論 Unicode

目錄 <Java home>/demo/jfc/Font2DTest/ 下包含了 Java 針對 Unicode 6.0 支援的相關範例。

ISO 4217 貨幣代碼的延伸支援

貨幣經由 ISO 4217 代碼辨別。這些代碼由外部的代理機構維護,並且獨立於 Java SE 平台外釋出。自 Java SE 7 起,將可以提供新的貨幣而無需釋出新版的 JDK。

若要在執行時期間替換預設貨幣,可事先建立一份名為 <JAVA_HOME>/lib/currency.properties 的特性檔。這份檔案需包含 ISO 3166 國家代碼以及 ISO 4217 貨幣資料的「鍵/值配對」。數值的部分由三項以逗號區分的 ISO 4217 貨幣數值所組成:字母代碼、數字代碼、以及最小單位。以 # 符號開頭的每一行皆會被視為註解。例如:

# Sample currency property for Japan
JP=JPZ,999,0

本功能的新 API 包括了下列方法,全部都位在 Currency 類別中:

分類 Locale 支援

預設地區可獨立地設定成兩種使用型態:format 使用在格式化資源上;display 使用在顯示選單和對話框中。新的 getDefault(Locale.Category) 方法可傳入 Locale.Category 參數。傳入 FORMAT 列舉的話,則此方法會回傳可供格式化資源的預設地區。同樣地,傳入 DISPLAY 列舉的話則會回傳 UI 所使用的預設地區。setDefault(Locale.Category, Locale) 方法可用為指定的分類設定地區。無參數的 getDefault() 方法會回傳 DISPLAY 的預設值。

在 Microsoft Windows 上,預設的初始值會依據 Windows 控制台中的「標準及格式」和「顯示語言」設定。

Locale 類別支援 BCP47 和 UTR35

Locale 類別已更新實作 BCP 47 (IETF BCP 47, "Tags for Identifying Languages") 和與 BCP 47 相容的 LDML (UTR#35, "Unicode Local Data Markup Language") 延伸以作為地區資料交換。

下述的巢狀類別已在本版中加入 Locale 類別:

  • Locale.Builder 可以用來建立 Locale 實體,並且可利用 setter 方法來修改其設定值。
下列方法已加入 Locale 類別: 下列常數已加入 Locale 類別: 更多訊息請參考 Java Tutorials 中的建立一個 Locale 以及 BCP 47 延伸

新的 NumericShaper 方法

NumericShaper 類別用來轉換 Latin-1 (歐洲語系) 數字到其他的 Unicode 十進位數字。在 Java SE 7 中加入了NumericShaper.Range 列舉,用來表達擁有十進位數字的字元集其 Unicode 的範圍。下列使用了 NumericShaper.Range 列舉的方法也一併加入了 Java SE 7 之中: 更多資訊請參考 Java Tutorials 中的轉換拉丁數字到其他 Unicode 數字

正規表示法 (Regular Expression) API 支援 Unicode 6.0

正規表示法模式已擴展為可支援 Unicode 6.0 匹配。你可以用 \u 或 \x 跳脫序列去匹配 Unicode 文字集 (code points)。

Java Tutorials 中的 Unicode 支援頁面有更多的資訊。

java.lang 套件

Java 程式語言

二進位數字表示法

在 Java SE 7 中,整數型態 (byteshortint 以及 long) 可表達成二進位數字系統,用 0b0B 開頭來指定二進位數字。

數值文字中的底線

在數值文字中,底線可以出現在所有數字之間。舉例來說,這項功能可以讓你在數值文字中去區分數字組,藉此增進程式碼的可讀性。

switch 指令支援字串

你可以在 switch 指令中使用 String 類別了。

泛型實體創建時的型別推論

現在可以用一個空的型別參數集 (<>) 來取代之前呼叫泛型類別的建構子時所需傳入的型別引數了,只要編譯器能從上下文中推斷該用哪些型別引數。此一角括號對被非正式地稱之為 diamond

改進了編譯器警告和錯誤訊息:在 Varargs 方法中無法實體化其形式參數時

當程式中無法實體化形式參數 (formal parameter) 時,Java SE7 編譯器會在該可變長度引數的方法和建樣子的宣告處發出警告訊息。Java SE 7 導入編譯器選項 -Xlint:varargs 和標註 @SafeVarargs 以及 @SuppressWarnings({"unchecked", "varargs"}) 來抑制這些警告。

try-with-resources 指令

此指令為宣告了一個或多個資源的 try 指令。resource 指的是在程式區段結束後必須被關閉的物件。try-with-resources 指令可確保每項資源在指令的最後都會被關閉。所有實作了 java.lang.AutoCloseable 介面和 java.io.Closeable 介面的物件皆可視為 resourcejava.io.InputStreamOutputStreamReaderWriterjava.sql.ConnectionStatement 以及 ResultSet 都已翻新去實作 java.lang.AutoCloseable 介面,並且可以在 try-with-resources 指令中使用。

抓取多種例外型別並以改進過的型別檢查來重新拋出例外

單一的 catch 區段可以處理超過一種以上的例外型別。另外和早期版本比較起來,編譯器可以更精確的分析需重新拋出的例外型別。這可以讓你在方法宣告的 throws 子句中可指定更多明確的例外型別。

Java 虛擬機器

JDBC

JDBC 4.1 加入了下列功能:

參考文章:
2011-06-15 02:46:40.654

[翻譯] JDK 7 特色中譯更新版

Update: Java SE 7 已正式釋出,詳細新功能列表請參考:Java SE 7 新功能與改進 - 0. 概觀

底下翻譯了 OpenJDK 網站上最新版的 JDK 7 Features,在正式版來臨前先一睹為快吧!


本文是 Oracle 和其他組織所開發的 JDK 7 功能列表。

下列功能將會薦舉進入 Java SE 7 Platform JSR,除了那些被列為實作特有的功能。

留言請至:jdk7-dev at openjdk.java.net

摘要

功能大致依序排列,從整個 JDK 軟體層級中的最底層一直到最高層。

分類項目
虛擬機器JSR 292:動態型別語言的支援 (InvokeDynamic)
嚴格類別檔案檢查
語言JSR 334:語言上的小改進 (Coin 專案)
核心升級類別載入器架構 (class-loader)
可關閉 URLClassLoader 的函式
並行性和容器的更新 (jsr166y)
國際化 (I18N)Unicode 6.0
Locale 的加強
區分使用者 Locale 及使用者介面 Locale
I/O 及網路JSR 203:更多 Java 平台上的全新 I/O API (NIO.2)
ZIP 及 JAR 壓縮檔的 NIO.2 檔案系統供應器
SCTP (串流控制傳輸協定)
SDP (Sockets Direct Protocol)
使用 Windows Vista IPv6 堆疊
TLS 1.2
安全性及密碼學橢圓曲線密碼學 (ECC)
資料庫連線JDBC 4.1
用戶端Java 2D 的 XRender 管線
為 6u10 圖像功能建立新的平台 API
Swing Nimbus 界面外觀
Swing JLayer 組件
Gervill 聲音合成器 [NEW]
Web更新 XML 堆疊包
管理增強的 MBeans [UPDATED]

本表中有 [NEW] 的功能已整合進 Milestone 1,但之前因文書上的失誤而未列入。另有一 [UPDATED] 功能。

曾經計劃過列入 JDK 7 但稍後卻延遲至 JDK 8 或其後版本的功能將會列在本頁最底端。

虛擬機器

JSR 292:動態型別語言的支援 (InvokeDynamic)

擴充了 JVM、Java 語言、及 Java SE API 以支援動態型別語言的實作品,可讓它們的速度直逼 Java 語言本身的效能。

規格:JSR 292java.lang.invoke
連結:專案頁面Wiki郵件清單

嚴格檔別檔案檢查

如同 Java SE 6JSR 202,以及剛批准的 JSR 924 中的維護版號規定,版本 51 (SE 7) 或之後版本的類別檔案 (class files) 必須經由型別檢查器驗證;VM 亦不能對舊的檢查器驗證失敗。

規格:JSR 202 §4.11.1

語言

JSR 334:語言上的小改進 (Coin 專案)

一些語言上的小變化,目的是為了簡化一些常見的、例行性的編程工作:switch 可使用 Stringtry-with-resources 指令、為泛型實體創建所改進的型別推論 ("diamond")、簡化多參數方法的呼叫、更好的文數字、以及改進的例外處理 (multi-catch)。

規格:JSR 334
連結:專案頁面郵件清單

核心

升級類別載入器架構 (class-loader)

修改 ClassLoader API 和實作品,以避免在非階層式類別載入器的拓撲結構中發生死結。

規格:java.lang.ClassLoaderregisterAsParallelCapablegetClassLoadingLock
連結:摘要

可關閉 URLClassLoader 的函式

提供一個方法來釋放被 URLClassLoader 所持有的潛在資源,像是已開啟的檔案。

規格:java.net.URLClassLoader.close
連結:摘要

並行性和容器的更新 (jsr166y)

一個輕量級的分岔/接合 (fork/join) 框架、彈性及可復用的同步關卡 (barrier)、傳輸佇列、並行的連結雙向 (linked double-ended) 佇列、以及本地執行緒 (thread-local) 的偽亂數產生器。

規格:java.util.concurrentForkJoinPoolPhaserTransferQueueConcurrentLinkedDequeThreadLocalRandom
連結:概觀APIWiki

國際化 (I18N)

Unicode 6.0

Unicode 的支援版本升級到 6.0。

規格:Unicode 6.0java.lang.Character

Locale 的加強

升級 java.util.Locale 以支援 IETF BCP 47 (Tags for Identifying Languages)UTR 35 (Local Data Markup Language)

規格:IETF BCP 47java.util.LocaleforLanguageTagtoLanguageTagUTR 35java.util.Locale - getUnicodeLocaleAttributesgetUnicodeLocaleTypegetUnicodeLocaleKeys
連結:概觀

區分使用者 Locale 及使用者介面 Locale

升級對區域的處理,將格式化用的 Locale 及使用者介面語言的 Locale 區分出來。

規格:java.util.LocalegetDefaultsetDefaultLocale.Category

I/O 及網路

JSR 203:更多 Java 平台上的新 I/O API (NIO.2)

新的 API,包括檔案系統存取、可調整的非同步 I/O 操作、Socket 通道綁定和組態、以及多點廣播的資料訊息 (multicast datagrams)。

規格:JSR 203
連結:專案頁面訪談談話影片java.net 文章

ZIP 及 JAR 壓縮檔的 NIO.2 檔案系統供應器

為 ZIP 及 JAR 檔提供完整功能並支援 NIO.2 檔案系統的供應器。

SCTP (串流控制傳輸協定)

Solaris 上與實作相關的串流控制傳輸協定 API。

連結:專案頁面郵件清單

SDP (Sockets Direct 協定)

Solaris 及 Linux 上與實作相關的支援。它在 Infiniband (無限寬頻) 的連線上具有可信賴且高效率的網路串流。

使用 Windows Vista IPv6 堆疊

升級網路相關的程式碼以使用 Windows Vista IPv6 堆疊,當其可用時將會優先於舊有的 Windows 堆疊。

TLS 1.2

增加對傳輸層安全性 1.2 版 (RFC 5246) 的支援。

規格:RFC 5246RFC 5289RFC 5469javax.net.sslExtendedSSLSessionSSLSocket.getHandshakeSession

安全性及密碼學

橢圓曲線密碼學 (ECC)

標準橢圓曲線密碼學演算法的可攜式實作品,使得所有 Java 應用程式都可以應用。

資料庫連線

JDBC 4.1

升級至 JDBC 4.1 及 Rowset 1.1

規格:java.sqljavax.sql.rowsetRowSetFactoryRowSetProvider

用戶端

Java 2D 的 XRender 管線

基於 X11 XRender 擴充上的新 Java2D 圖形管線,它可存取大部份現今 GPU 的功能。

為 6u10 圖像功能建立新的平台 API

為 6u10 版本中原先已實作的功能建立新的平台 API:半透明和變形視窗、重量級/輕量級混合。

規格:java.awtWindowsetShapesetQpacityComponent

Swing Nimbus 界面外觀

Swing 裡下一代跨平台的界面外觀。

規格:javax.swing.plaf.nimbus
連結:專案頁面

Swing JLayer 組件

新增 SwingLabs JXLayer 組件裝飾器至平台中。

規格:javax.swing.JLayer
連結:JXLayer 專案

Gervill 聲音合成器 [NEW]

丟棄老舊的、專有的及繁重的聲音合成器,並改用為聲音合成引擎專案 (Audio Synthesis Engine Project) 而創建並提案的 Gervill 合成器。

連結:專案頁面

Web

更新 XML 堆疊包

升級 XML 堆疊包中的組件到最新近的穩定版本: JAXP 1.4、JAXB 2.2a、和 JAX-WS 2.2。

規格:JSR 206 (JAXP)JSR 222 (JAXB)JSR 224 (JAX-WS)

管理

增強的 MBeans [UPDATED]

增強了現有的 com.sun.management MBeans,使其可報告當前整個系統的 CPU 負載、JVM 行程的 CPU 負載、以及當 GC 事件發生時送出 JMX 通知 (此功能先前包含在一個已改進過的 JMX 代理程式上,但後因缺乏時間而遭摒棄)。

規格:com.sun.managementOperatingSystemMXBeanGarbageCollectorMXBean

延遲至 JDK 8 或其後版本

JSR 294:模組編程的語言和 VM 支援

針對 Java 語言及 VM 規格的加強,使其支援模組編程,不管是編譯時期或執行時期。

規格:JSR 294
連結:郵件清單

JSR 308:Java 型別上的標註 (Annotation)

擴充了 Java 標註語法,允許它出現在每次使用型別時。

規格:JSR 308
連結:專案頁面詳細專案頁面

譯註:目前標註僅能使用在標註宣告、Package 宣告、型別宣告(包括類別、介面、列舉等宣告)、欄位宣告 (包括列舉常數宣告)、建構子宣告、方法宣告、參數宣告、和區域變數宣告上。此項改變可使得標註能出現在每次型別和型別參數出現時,以及其他地方。例如:

  • interface MyList<@ReadOnly T> {} // 型別參數
  • myStr = (@NonNull String) myObj; // 型別使用
  • List<@NonNull Integer> myList; // 型別使用
  • void read() throws @Critical IOException {} // 型別使用
  • @Readonly Document [] [] docList1 = new @Readonly Document [1][2]; // 陣列
  • Document @Readonly [] [] docList2 = new Document @Readonly [1][2]; // 陣列
  • Document [] @Readonly [] docList3 = new Document[1] @Readonly [2]; // 陣列
  • new @Interned MyObject(); // 建構子呼叫
  • public String toString() @ReadOnly { … } // 函式接收者

JSR TBD:容器的語言支援

不可變的 (immutable) 的 List、Set、和 Map 的文字運算式,以及 List 和 Map 的索引存取語法。

連結:專案頁面郵件清單

JSR TBD:Lambda 專案

提供給 Java 語言的 Lambda 表達式 (非正式地說法是 Closure)。

連結:專案頁面郵件清單

模組化 (Jigsaw 專案)

一個簡單、低階的模組系統,它側重於模組化 JDK,以及該系統的應用程式到 JDK 本身。

連結:簡介專案頁面郵件清單

JSR 296:Swing 應用程式框架

一套 API 可定義典型 Swing 程式的基本結構,從而消除許多樣板程式碼,並提供大為改善的初始開發者經驗。

連結:JSR 296

Swing JDatePicker 組件

新增 SwingLabs JXDatePicker 組件至平台中。

連結:JXDatePicker API

最後更新:2011/5/16 10:50 -0700

2010-04-25 01:54:11.171

[翻譯] JDK 7 特色中譯

Update: 新版請參見 - [翻譯] JDK 7 特色中譯更新版

時序已來到 2010 年,距離發佈 JDK 7 的時間越來越近。預計今年秋季釋出的 JDK 7 正式版中到底有哪些新功能呢?底下翻譯了 OpenJDK 網站上所公佈的 JDK 7 Features,在正式版來臨前先一睹為快吧!


本文是 Oracle 和其他組織為 JDK 7 所開發的功能列表。

當 Java SE 7 平台的 JSR 送交時,這些功能會在其中被薦舉,除了那些列為 VM 層級或與實作相關的功能。

摘要

功能大致依序排列,從整體 JDK 中的最底層到最高層。

分類項目
虛擬機器64 位元物件指標壓縮
垃圾優先的 GC (G1)
JSR 292:非 Java 語言的 VM 支援 (InvokeDynamic)
語言JSR 294:模組編程的語言和 VM 支援
JSR 308:Java 型別上的標註 (Annotation)
JSR TBD:語言的小改進 (Coin 專案)
JSR TBD:Lambda 專案
核心模組化 (Jigsaw 專案)
升級類別載入器架構 (class-loader)
可關閉 URLClassLoader 的函式
Unicode 5.1
並行性和容器的更新
JSR 203:更多 Java 平台上的新 I/O API (NIO.2)
SCTP (串流控制傳輸協定)
SDP (Sockets Direct Protocol)
橢圓曲線密碼學 (ECC)
客戶端Java 2D 的 XRender 管線
6u10 部署功能
為 6u10 圖像功能建立新的平台 API
Swing Nimbus 界面外觀
Swing JLayer 組件
Web更新 XML 堆

曾經計劃過但稍後卻被摒棄的功能會列在本頁最底端。

虛擬機器

64 位元物件指標壓縮

將 64 位元指標壓縮成 32 位元的技術,可減少記憶體和其頻寬的耗用,從而增進整體效能 (VM 層級的功能)。

連結:Wiki

垃圾優先的 GC (G1)

新的垃圾收集器。它保証會比現有的 CMS 收集器還花費更少的暫停時間,以及擁有更佳的可預測性 (VM 層級的功能)。

連結:ISMM 2004 paper摘要

JSR 292:非 Java 語言的 VM 支援 (InvokeDynamic)

VM 支援非 Java 語言的實作品,可讓它們的效能直逼 Java 語言本身的效能。

連結:JSR 292專案頁面Wiki郵件清單

語言

JSR 294:模組編程的語言和 VM 支援

針對 Java 語言及 VM 規格的加強,使其支援模組編程,不管是編譯時期或執行時期。

連結:JSR 294郵件清單

JSR 308:Java 型別上的標註 (Annotation)

擴充了 Java 標註語法,允許它出現在每次使用型別時。

連結:JSR 308專案頁面詳細專案頁面

譯註:目前標註僅能使用在標註宣告、Package 宣告、型別宣告(包括類別、介面、列舉等宣告)、欄位宣告 (包括列舉常數宣告)、建構子宣告、方法宣告、參數宣告、和區域變數宣告上。此項改變可使得標註能出現在每次型別和型別參數出現時,以及其他地方。例如:

  • interface MyList<@ReadOnly T> {} // 型別參數
  • myStr = (@NonNull String) myObj; // 型別使用
  • List<@NonNull Integer> myList; // 型別使用
  • void read() throws @Critical IOException {} // 型別使用
  • @Readonly Document [] [] docList1 = new @Readonly Document [1][2]; // 陣列
  • Document @Readonly [] [] docList2 = new Document @Readonly [1][2]; // 陣列
  • Document [] @Readonly [] docList3 = new Document[1] @Readonly [2]; // 陣列
  • new @Interned MyObject(); // 建構子呼叫
  • public String toString() @ReadOnly { … } // 函式接收者

JSR TBD:語言的小改進 (Coin 專案)

一些語言上的小變化,目的是為了簡化一些常見的、例行性的編程工作。

連結:專案頁面郵件清單

JSR TBD:Lambda 專案

提供給 Java 語言的一級函式、函式型別和 Lambda 表達式 (非正式地說法是 Closure)。

連結:專案頁面郵件清單

核心

模組化 (Jigsaw 專案)

一個與實作相關、簡單、低階的模組系統,它側重於模組化 JDK,以及該系統的應用程式到 JDK 本身。

連結:簡介專案頁面郵件清單

升級類別載入器架構 (class-loader)

修改 ClassLoader API 和實作品,以避免在非階層式類別載入器的拓撲結構中發生死結。

連結:摘要

可關閉 URLClassLoader 的函式

提供一個方法來釋放被 URLClassLoader 所持有的潛在資源,像是已開啟的檔案。

連結:摘要API

Unicode 5.1

Unicode 的支援版本升級到 5.1。

並行性和容器的更新

一個輕量級的分岔/接合框架、一般化的關卡 (barrier) 和佇列、一個並行性參考的 (concurrent-reference) HashMap、和可控制細粒度讀寫順序的柵欄。

連結:概觀APIWiki

JSR 203:更多 Java 平台上的新 I/O API (NIO.2)

新的 API,包括檔案系統存取、可調整的非同步 I/O 操作、Socket 通道綁定和組態、以及多點廣播的資料訊息 (multicast datagrams)。

連結:JSR 203專案頁面訪談談話影片java.net 文章

SCTP (串流控制傳輸協定)

Solaris 上一套與實作相關的串流控制傳輸協定 API。

連結:專案頁面郵件清單

SDP (Sockets Direct 協定)

Solaris 上一套與實作相關的 Sockets Direct 協定 API。

橢圓曲線密碼學 (ECC)

標準橢圓曲線密碼學演算法的可攜式實作品,使得所有 Java 應用程式都可以應用。

客戶端

Java 2D 的 XRender 管線

基於 X11 XRender 擴充上的新 Java2D 圖形管線,它可存取大部份現今 GPU 的功能。

6u10 部署功能

從 6u10 版本而來的實作相關部署功能:新的 Java Plug-in、Java 核心、Java Quick Starter、和相關的安裝程式功能。

為 6u10 圖像功能建立新的平台 API

為 6u10 版本中原先已實作的功能建立新的平台 API:半透明和變形視窗、重量級/輕量級混合、以及增強的 AWT 安全性警示。

Swing Nimbus 界面外觀

Swing 裡下一代跨平台的界面外觀。

連結:專案頁面

Swing JLayer 組件

新增 SwingLabs JXLayer 組件裝飾器至平台中。

連結:JXLayer 專案

Web

更新 XML 堆

升級 JAXP、JAXB、和 JAX-WS API 到最新近的穩定版本。

已摒棄

JSR 296:Swing 應用程式框架

一套 API 可定義典型 Swing 程式的基本結構,從而消除許多樣板程式碼,並提供大為改善的初始開發者經驗。

連結:JSR 296

Swing JDatePicker 組件

新增 SwingLabs JXDatePicker 組件至平台中。

連結:JXDatePicker API

最後更新:2010/2/9 13:31 -0800

2008-04-30 13:52:27.343

在 Windows 的 Eclipse 中撰寫 Python 程式 (2) - 在 Eclipse 中安裝 PyDev

安裝好 Python 之後,就可以在命令提示字元的視窗中輸入 python 來執行 Python 程式(前提是有先設好 PATH 變數)。當然如果我們要撰寫大量的程式碼時,使用文字編輯器或編譯器會是比較好的方式。下列介紹如何使用 Eclipse 來撰寫 Python 程式。

Eclipse 是一套知名的 Java 程式編譯器,它有著許多豐富的外掛程式。其中一項名為 PyDev 的外掛程式可以讓我們在 Eclipse 中撰寫並編譯、執行及除錯 Python 的程式碼。你可以直接到 PyDev 的下載頁面 來下載,目前的版本是 1.3.15,支援 Eclipse 3.3、Python 2.3.x or 2.4.x。
2.png

我們使用的從 Eclipse 中直接安裝 PyDev,如此一來如果日後有新版本的話,那麼直接在 Eclipse 中更新即可,比較方便。開啟 Eclipse 後點擊選單「Help」/「Software Updates」/「Find and Install...」。在跳出軟體安裝的視窗後,我們選擇「Search for new features to install」圓鈕:
11.png

點擊「Next」按鈕後,接著就是要新增軟體安裝來源的網址。首先點擊「New Remote Site」按鈕,並填入 Name: PyDev、URL: http://pydev.sourceforge.net/updates/,接著按下「OK」按鈕,此時我們已經成功新增一筆安裝來源網址了。在確認「Site to include in search:」清單中 PyDev 項目有打勾之後,按下「Finish」按鈕:
12.png

按下「Finish」按鈕之後 Eclipse 會連線搜尋(請確定電腦是否能順利上網),接著會出現搜尋結果視窗。此處僅需要勾選「PyDev for Eclipse 1.3.15」項目,其他的都不用勾選:
13.png

選擇「Next」之後,便開始 PyDev 的安裝過程。第一步會先有版權宣告:
14.png

第二步是選擇安裝目錄。當然此處我們都是直接點選「Finish」按鈕,因為預設它會直接安裝在 Eclipse 的目錄下:
15.png

第三步開始下載 PyDev 套件:
16.png

第四步下載完成後,Eclipse 會跳出確認視窗,詢問你是否真的要安裝此一套件。此處直接選擇「Install」:
17.png

第五步正式安裝:
18.png

第六步安裝完成,Eclipse 會提示你要重新啟動程式才可以跑 PyDev:
19.png

重開 Eclipse 後,我們就可以開始寫 Python 程式了。中間為程式碼區塊、左方為專案及檔案目錄的樹狀架構區、右方為程式碼摘要,以及下方為程式執行結果、搜尋結果、待辦事項、程式碼片斷清單、伺服器管理等小工具面板:
20.png

2008-04-29 18:59:03.359

在 Windows 的 Eclipse 中撰寫 Python 程式 (1) - 在 Windows 中安裝 Python

本篇是和 MaxChu 約好要發表,可是一直遲遲沒有生出來的文章。話說 MaxChu 同學,我發了這篇之後,你也差不多該把在 Eclipse 上玩 GWT 和外掛的文章寫一寫了 XD

要想在 Windows 的 Eclipse 上玩 Python,首先要安裝好 Python (廢話~_~)。先連到 Python 的下載頁面,尋找 Python 2.5.2 Windows installer 的連結來下載 Windows 安裝程式。
1.png

下載完成之後,就可以點擊 python-2.5.2.msi 來安裝了,此處我們選擇「Install for all users」來讓電腦上的每個使用者都可以使用 Python:
3.png

接下來選擇安裝目錄。一般來說都是建議使用預設目錄,不過我個人偏好安裝在其他磁區的英文目錄之中,並且該目錄不含有空白字元。不使用中文目錄或含有空白字元的目錄的原因是為了預防少數可能會發生的路徑錯誤問題。當然這只是我個人的想法,實際上目錄名稱中含有中文字或空白字元或許對執行 Python 不會造成任何問題:
4.png

選擇目錄之後,可以決定要安裝哪些功能,這邊可視情況調整欲安裝的功能。我選擇的是全部安裝:
5.png

接著程式就會開始安裝:
6.png

安裝完成:
7.png

開啟命令提示字元的視窗,切換到安裝目錄下,輸入 python 之後就可以開始寫程式了:
8.png

如果想要在任何目錄下都可以執行 python 的話,別忘了到「控制台」/「系統」/「進階」分頁/「環境變數」中,把安裝目錄加到 PATH 變數中。

2007-10-24 17:25:30.765

Spring Framework 2.5 RC1 釋出

Spring Framework 團隊日前釋出了 Spring Framework 2.5 RC1 (候選版本),這意味著正式版在不久的將來中發表。此版中有許多重大的更新和改進,包括:
  • 完整的 Java 6 及 Java EE 5 支援 (JDBC 4.0, JTA 1.1, JavaMail 1.4, JAX-WS 2.0 等等)
  • full-featured annotation-driven dependency injection (including support for 'qualifiers')
  • 支援在類別路徑 classpath 中掃描組件 (自動偵測已評註的類別 (annotated classes))
  • bean name pointcut element in AspectJ pointcut expressions
  • 內建 AspectJ 載入時間時嵌入的支援 (基於 LoadTimeWeaver 抽象化)
  • 先進的 XML 組態命名空間 ("context", "jms")
  • 完整改寫整合測試的框架 (針對 JUnit 4 及TestNG 的支援)
  • 新的 Servlet MVC 和 Portlet MVC 的 annotation-based 控制器風格
  • 延伸 SimpleJdbcTemplate 的功能性 (支援已命名參數等等)
  • 官方認證的 WebSphere 支援 (支援 WebSphere 6 UOWManager)
  • Spring framework jars are shipped as OSGi-compliant bundles out of the box
  • Spring ApplicationContext 可配置為 JCA RAR 檔 (for headless application modules)
  • JCA 1.5 message endpoint management (for Spring-managed JMS and CCI message listeners)
相關連結:
2007-05-29 15:11:02.812

[感想]寫程式到底需不需要懂數學?

本篇原是發表在Mr./Ms. Days - 網路, 資訊, 觀察, 生活 - 寫程式到底需不需要懂數學?的迴響,我將它稍稍整理一下後重貼如下:
寫程式超過十年,一直很高興自己是數學系出來的,而不是資工本科系出來的。為什麼?

每當我要寫程式時,我腦中自然就會浮現出能簡化步驟,加快效率的方法和定理;我同時能擁有「將問題化成數學題目和演算法」的能力,以及「將數學演算法寫成程式」的能力。有些人說寫程式不用數學,我倒不這樣認為。只要你的程式中含有「邏輯和演算法」的話,那基本上就已經牽涉到數學了。我認為大家在爭論的,是「到底數學應該要用得深還是不用太深」、「只需要基本用法,還是要儘量多用進階技巧」。

寫程式,多多少少都會用到數學,除非你的程式是只在螢幕上印出 "Hello world!" 之類的簡易程式,沒有「邏輯和演算法」可言。不過只要一碰到演算法,效率好的演算法和效率不好的馬上就可以區分出來。之前很紅的「The art of programming」、「The pearl of programming」、「C 精選名題100題」等等的書,仔細翻開來看,裡面在說的,不就都是數學嗎?問題只在於,你想要用在程式裡的,是哪一種演算法?是快的那一種,還是慢的那一種?或者是適合的那一種?

一個從 1 累加到 n (n>1) 的整數運算式,用 for 迴圈累加起來求解,其實就已經是數學,是一種演算法了,只是顯得毫無效率,直接改用梯形公式就可在 O(1) 解決。跑一個 20^1, 20^2, ..., 20^n (n>1,n為正整數)各除以 p (p為正整數)之後,所餘下的各個餘數為何,你可以用 for 迴圈來把每個 20^k 的項次展開 (pow()) 後再去除以 p 求解,當然得花上你 O(n^2) 的時間,並且還要處理長整數數值溢位的可能,但若直接改用模數運算來跑全部,可在 O(n) 內解決,並且不會有長整數溢位的困擾。平平一樣都可以求出解法,但是在效率上自然有差別。

想用到那一種程度的數學,端看需求而已。一千筆資料的「找出某筆資料修改後重新排序」、「每頁任意n筆的動態有序分頁」、「相互交叉比對求得最符合查詢條件的資料之排行榜」、「分析並建立語詞、語義索引資料庫」…等等,有一千筆時的做法,一千萬筆則有一千萬時的做法。需求不同、時程不同,條件不同,硬體不同,而所用的演算法也不一定相同。在不同的地方,選擇適合的方式下去做。有些雞肋的小地方,也不用執著於用牛刀來殺。

另外,有關於邏輯的部份。數學系在 1+1=2 都得先證明它是正確的以後 (需要用到多個定理),我們才敢去用它來計算,也因此我們才敢說:「是的,九九乘法表是正確無誤的,因為我們可以證明 3*2 => 3+3 的確會等於 6」。每一個運算子,每一次計算,我們都必需要小心地去用邏輯推理。a*b 並不恆等於 b*a (你必須先知道 a, b 元素和其 * 運算子的定義,才能證明),c 也不一定等於 c+0 (同樣,你得先知道 c 元素, 零元素 和 + 運算子的定義)。我們用嚴謹的邏輯去推理,去思考,我們才能真正的說:梯形公式的確比for迴圈累加快、模數運算的演算法的確比各項各自展開後再求來得快。

邏輯論、數論、集合論、圖論、離散數學、演算法、資料結構、網路架構,其實骨子不都是數學嗎?Google 或其他知名大公司的面試考題,不是也有很多題目是和邏輯及演算法相關的?如果寫程式不需要較深、較進階的數學的話,那麼何必要用這些題目做為考題呢?

多學會一種技巧,並不會讓你的刀劍變鈍,反而會讓它更加鋒利和光亮。你的程式裡可以不需要用到複雜的數學,而使用簡易的方法,完全取決於你想要你的程式如何運作。但是要注意,在程式的撰寫從 DOS 的單工、其他作業系統的多工、多執行緒、多核心平行處理,一直演化到後來的網路分散式架構時,或許用更宏觀的角度來對待程式撰寫,可以讓我們的程式更具有競爭力和效率,也可以讓我們程式設計人員本身有更寬廣的心,以及具有更高的專業價值。

至今我仍然很慶幸,當初毅然在資工大二時,轉唸應用數學的決定。

Page: 1 2 3 Next >