碁峰

在Java發展的過程中,由於Java的應用領域越來越廣,並逐漸擴及至各級應用軟體的開發,Sun公司在1999年6月美國舊金山的Java One大會上,公佈了新的Java體系架構,該架構根據不同級別的應用開發區分了不同的應用版本:J2SE(Java 2 Platform, Standard Edition)、J2EE(Java 2 Platform, Enterprise Edition)與J2ME(Java 2 Platform, Micro Edition)。

J2SE、J2EE與J2ME是當時的名稱,由於Java SE 6後Java不再帶有"2" 這個號碼,J2SE、J2EE與J2ME分別被正名為Java SE、Java EE與Java ME。儘管Sun從2006年底,就將三大平臺正名為Java SE、Java ME與Java EE,但時至今日,J2SE、J2ME與J2EE這個名詞還是很多人用。

Java SE(Java Platform, Standard Edition)

Java各應用平臺的基礎,想要學習其他的平臺應用,必先瞭解Java SE以奠定基礎,Java SE也正是本書主要的介紹對象。

Java SE可以分作四個主要的部份:JVM、JRE、JDK與Java語言。

為了要能運行Java撰寫好的程式,必須有Java虛擬機器(Java Virtual Machine, JVM)。JVM包括在Java執行環境(Java SE Runtime Environment, JRE)中,所以為了要運行Java程式,必須安裝JRE。如果要開發Java程式,必須取得JDK(Java SE Development Kits),JDK包括JRE以及開發過程中需要的一些工具程式,像是javac、java等工具程式。

Java語言只是Java SE的一部份,除了語言之外,Java最重要的就是提供龐大且強大的標準API,提供字串處理、資料輸入輸出、網路套件、使用者視窗介面等功能,你可以使用這些API作為基礎來進行程式開發,無須重複開發功能相同的元件,事實上,在熟悉Java語言之後,更多的時候,都是在學習如何使用Java SE提供的API來組成應用程式。

圖1. Java SE的組成概念圖

Java EE(Java Platform, Enterprise Edition)

Java EE以Java SE為基礎,定義了一系列的服務、API、協定等,適用於開發分散式、多層式(Multi-tier)、以元件為基礎、以Web為基礎的應用程式, 整個Java EE的體系是相當龐大的,比較為人熟悉的技術像是JSP、Servlet、JavaMail、Enterprise JavaBeans(EJB)等,當中每個服務或技術都可以使用專書進行說明,並非本書說明的範圍,但可以肯定的是,必須在Java SE上奠定良好的基礎,再來學習Java EE的開發。

Java ME(Java Platform, Micro Edition)

Java ME是Java平臺版本中最小的一個,目的是作為小型數位設備上開發及部署應用程式的平臺,像是消費性電子產品或嵌入式系統等,最為人熟悉的設備如手機、PDA、股票機等,你可以使用Java ME來開發出這些設備上的應用程式,如 Java遊戲、股票相關程式、記事程式、月曆程式等。

JCP與JSR

Java不僅是程式語言,而是標準規範!有標準的好處是什麼?現在許多電腦週邊設備,都採用USB作為傳輸介面,這讓電腦中不用再接上一些轉接器,跟過去電腦主機後面一堆不同規格的傳輸介面相比,實在方便了不少,許多手機的充電器,也都採用USB介面了, 這真是件好事。

回頭來談談Java是標準規範這件事。你知道嗎?編譯/執行Java的JDK/JRE,並不只有Oracle才能實現,IBM也可以撰寫自己的JDK/JRE,其他廠商或組織也可以撰寫自己的JDK/JRE,你寫的Java程式,可以執行在這些不同廠商或組織寫出來的JRE上。以第2章將學到的第一個Java程式為例,其中會有這麼一段程式碼:

System.out.println("Hello, World");

這行程式目的是:「請系統(System)的輸出裝置(out)顯示一行(println) "Hello, World"」。誰決定使用System、out、println這些名稱的?為什麼不是Platform、Output、ShowLine這些名稱?如果Oracle使用System、out、println這些名稱,而IBM使用了Platform、Output、ShowLine這些名稱,用Oracle的JDK寫的程式,就不能執行在IBM的JRE上,那Java最基本的特性之一「跨平臺」,就根本無法實現了!

Java最初由Sun創造,為了讓對Java興趣的廠商、組織、開發者與使用者參與定義Java未來的功能與特性,Sun公司於1998年組成了JCP(Java Community Process),這是一個開放性國際組織,目的是讓Java演進由Sun 非正式地主導,成為全世界數以百計代表成員公開監督的過程。

任何想要提議加入Java的功能或特性,必須以JSR(Java Specification Requests)正式文件的方式提交,JSR必須經過JCP執行委員會(Executive Committee)投票通過,方可成為最終標準文件,有興趣的廠商或組織可以根據 JSR 實現產品。

若JSR成為最終文件後,必須根據JSR實作出免費且開放原始碼的參考實現,稱為RI( Reference Implementation),並提供TCK(Technology Compatibility Kit)作為技術相容測試工具箱,方便其他想根據JSR實現產品的廠商或組織參考與測試相容性。

現在無論是Java SE、Java EE或 Java ME,都是業界共同訂製的標準,每個標準背後代表了業界面臨的一些問題,他們期待使用Java來解決問題,認為應該有某些元件、特性、應用程式介面等,來解決這些問題,因而製訂JSR作為正式標準規範文件,不同的技術解決方案標準規範會給予一個編號。

在JSR規範的標準之下,各廠商可以各自實作成品,所以同一份JSR,可以有不同廠商的實作產品,以Java SE為例,對於身為開發人員,或使用Java開發產品的公司而言,只要使用相容於標準的JDK/JRE 開發產品,就可以執行於相容於標準的JRE上,而不用擔心跨平臺的問題。

Java SE 9的主要規範是在JSR 379文件之中,而Java SE 9中的特定技術, 會再規範於特定的JSR文件之中,若對這些文件有興趣,可以參考JSR379:jcp.org/en/jsr/detail?id=379

JSR對於Java初學者而言過於艱澀,但JSR文件規範了相關技術應用的功能,將來有能力時,可以試著自行閱讀JSR,這有助於瞭解相關技術規範的更多細節。

圖2. JCP、JSR、RI與TCK

建議的學習路徑

Java不僅是程式語言,而是標準規範,每個標準代表著廠商面臨的問題,代表著解決問題的方案,也因此,學習Java,就等於在面臨各式問題如何解決, 然而,這麼多的問題,沿生出如此多的解決方案,也因此對於初學Java的人, 如同面臨滿載產品的龐大貨輪,不知從何開始,也不知將來何去何從。

在Java的官方網站提供有一份Java技術觀念地圖(Java Technology Concept Map)的文件(www.oracle.com/technetwork/topics/newtojava/intro-142494.html

在這份文件中,密密麻麻地列出了大部份Java相關地圖與簡要說明,也代表了Java技術範疇的廣泛,然而要從這麼龐大的地圖中,找出一條適合初學Java 的路線圖絕非易事,以下是我基於經驗與教學建議的學習路徑:

深入瞭解JVM/JRE/JDK

許多書籍對於JVM/JRE/JDK的說明,通常以極短的篇幅介紹,通常就是在短短幾頁中,請使用者依書中步驟安裝與設定PATH、CLASSPATH後,就開始介紹Java程式語言,而許多人到了業界後就開始使用IDE(Integrated Development Environment)代勞所有JDK細節,這麼作的結果就是,在IDE中遇到與JDK相關的問題,就完全不知道如何解決。

JVM/JRE/JDK 並不是用短短幾頁就可以說明,若沒有「JVM是Java程式唯一認識的作業系統,其可執行檔為.class檔案」的重要觀念,就無法理解PATH與CLASSPATH並非同一層級的環境變數,JDK中許多指令與選項,其實都可以對應至IDE中某個設定與操作,你對JVM/JRE/JDK有足夠的認識,對IDE中相關選項就不會有疑問,也不會換個IDE就不知所適,或沒有IDE就無法撰寫程式。

理解封裝、繼承、多型

對於Java程式語言,if...else、for、while、switch等流程語法,早已是必須熟練的基礎,更重要的是,Java支援物件導向(Object Oriented),你必須理解物件導向中最重要的封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism)觀念,以及如何用Java相關語法來實現。

許多人撰寫Java程式,並沒有善用其支援物件導向的特性,問到何謂封裝而無法回答(甚至回答定義類別即為封裝),濫用Java繼承語法,不懂多型而不知如何運用API文件(更別說運用多型設計程式了),最後的結果就是淪於死背API文件、使用「複製、貼上」大法來撰寫程式,整個應用程式架構雜亂無章而難以維護。

掌握常用 Java SE API 架構

Java並非只是程式語言,還帶有龐大的各式程式庫(Library),對初學者而言,首要是掌握常用的Java SE API,像是例外(Exception)、群集(Collection)、輸入輸出、執行緒(Thread)等,學習這些標準API,絕不要淪於死背,應先掌握API在設計時的封裝、繼承、多型架構,以Collection為例,在學習時必須先理解,為何要設計為圖3的架構。

圖3. Collection API架構範例

學習容器觀念

在步入Java EE領域之後,經常接觸到容器(Container)的觀念,許多人完全以API層次來使用Java EE相關元件,這是不對的。容器就實作層面來說,就是執行於JVM上的Java應用程式,抽象層面來說,就是你的應用程式溝通、協調相關資源的系統。

初次接觸容器的開發人員會覺得容器很抽象,以實際的例子來說,通常初學者步入Java EE,會從學習Servlet/JSP開始,而Servlet/JSP是執行於Web容器之中,這是學習容器觀念時不錯的開始,你必須知道「Web容器是Servlet/JSP唯一認得的HTTP伺服器,是使用Java撰寫的應用程式,運行於JVM之上」,如果希望用Servlet/JSP撰寫的Web應用程式可以正常運作,就必須知道Servlet/JSP如何與Web容器作溝通,Web容器如何管理Servlet/JSP的各種物件等問題。

容器的觀念無所不在,Applet會執行於Applet容器中,因此相關資源受到Applet容器的管理與限制,Servlet/JSP執行於Web容器之中,EJB執行於EJB容器之中,Java應用程式客戶端執行於應用程式客戶端容器之中,不理解元件如何與容器互動,就無法真正善用或理解元件的行為。

“容器就實作層面來說,就是執行於JVM上的Java應用程式,抽象層面來說,就是你的應用程式溝通、協調相關資源的系統。”

研究開放原始碼專案

Java不僅是程式語言,也是個標準,在共同標準下有不同的實作方式,在Java 領域的許多實作,都是以開放原始碼的方式存在,只要你有興趣,可以下載原始碼了解實作方式,從中瞭解甚至吸收他人設計、實現產品的技巧或理念。

許多基於Java各標準平臺發展出來的產品也值得研究,例如測試框架(Framework)、Web框架、永續(Persistance)框架、物件管理容器等,這些產品補足標準未涵蓋之處,各有其設計上優秀與精良之處,有些更進而回饋至 Java 而成為標準之一,重點是它們也多以開放原始碼的方式存在,讓開發人員可以使用、研究甚至參與改進。

學習設計模式與重構

在程式設計上,「經驗」是最重要的,在經驗傳承上,歸納而言,無非就是「如何根據需求作出好的設計」、「如何因應需求變化調整現有程式架構」, 對於前者,流傳下來的設計經驗就是設計模式(Design pattern),對於後者,流傳下來的調整手法就是重構(Refactor)。

「如果我當初就這麼設計,現在就不會發生這個問題了!」這種對話應該很熟悉,「當初就這麼設計」就是所謂設計模式。「如果我當初先這麼改,再那麼改,就不會把程式改到爛了!」這種對話也經常聽到,「當初先這麼改,再那麼改」就是所謂重構。

無論是好的設計或不好的設計,都要有經驗傳承。經驗可以口耳相傳,可以從原始碼中觀摩,也可以從書籍或網路上優秀的技術文件中習得,對於初學者,從優秀的技術文件學習設計模式與重構,是快速累積經驗的捷徑。

熟悉相關開發工具

除了累積足夠的實力與基礎,善用工具是必要的,開發工具可以避免繁瑣的指令、減少重複性的操作、提示可用的API、自動產生程式碼、降低錯誤的發生,甚至執行各種自動化的測試、報告產生與發送郵件等任務。有些開發人員鄙視開發工具,這是不必要的,兩個實力相同的開發人員撰寫相同的應用程式,使用良好開發工具的人必然有較好的效率。

在Java領域難能可貴的,是存在不少優秀的開發工具,而且多以開放架構、開放原始碼的方式存在,如Eclipse IDE、NetBeans IDE、IntelliJ IDEA都是相當不錯的選擇,還可以搭配Ant建構工具、Maven或Gradle專案工具等一同使用,大大地提昇開發人員的產能。

建議初學Java的人,可以挑選一種開發工具來熟悉,所謂熟悉,不是指「下一步要按哪個按鈕、接下來要執行哪個選單」,而是指這些開發工具相關操作, 是為了代勞你手動執行哪些指令,開發工具中的某些選項,是為了代勞你設定哪些變數,錯誤提示原本是來自JDK的什麼訊息等,以這樣的過程來熟悉開發工具,才能善用開發工具提昇產能,而不是受制於開發工具,如此就算換了另一套開發工具,也可以在最短時間內上手。(摘錄整理自《Java SE 9 技術手冊》)

 書籍簡介 

Java SE 9 技術手冊

林信良/著

碁峰出版

售價:650元

 作者簡介 

林信良

目前為自由工作者,專長為技術寫作、翻譯與教育訓練。喜好研究程式語言、框架、社群,從中學習設計、典範及文化。閒暇之餘記錄所學,技術文件涵蓋C/C++、Java、Ruby/Rails、Python、JavaScript、Haskell、OpenSCAD等領域,個人網站openhome.cc。


熱門新聞

Advertisement