書名: JRuby語言實戰技術作者名: (德)駱古道 王德志 姜偉本章字數: 1911字更新時間: 2018-12-29 19:21:20
1.4 JRuby語言與Java語言實例分析
這一節我們用三個實例來說明JRuby語言和Java語言代碼的差異,第一個實例是JRuby語言代碼比Java語言代碼更為簡潔;第二個實例是Java語言的語法太死板,缺乏靈活性;第三個實例是Java語言的面向對象技術不徹底。
1.4.1 實例一:JRuby語言代碼的簡潔性
本實例展示JRuby語言的簡潔特性。
這里有兩個實例程序:Java語言程序如代碼清單1-6所示,JRuby語言程序如代碼清單1-7所示。它們都采用Java語言的類java.util.TreeMap進行代碼編程。在這兩個程序中,都使用空行將程序分成為三個部分,各部分的含義基本上是相同的。第一部分是定義該程序所需要的類;第二部分是創建基于類java.util.TreeMap的對象map,并且賦予這個對象初始值;第三部分是利用兩門語言的不同技術獲取對象map的鍵和值,并且顯示它們的和。
代碼清單1-6 Java語言程序JavaTreeMap.java
1 import java.util.Iterator;
2 import java.util.Map;
3 import java.util.TreeMap;
4 public class JavaTreeMap {
5 public static void main( String[] args ) {
6 TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
7 map.put( 1, 10 );
8 map.put( 21, 12 );
9
10 int memo = 0;
11 Iterator it = map.entrySet().iterator();
12 while (it.hasNext()) {
13 Map.Entry me = (Map.Entry)it.next();
14 memo = ((Integer)me.getKey()).intValue() + 【空一格繼續】
((Integer)me.getValue()).intValue();
15 System.out.println(memo);
16 }
17 }
18 }
代碼清單1-7 JRuby語言程序java_tree_map.rb
1 include Java 2 import java.util.TreeMap 3 map = TreeMap.new 4 map[1], map[21] = 10, 12 5 map.inject(nil) do |memo, (key,value)| 6 puts memo = key+value 7 end
現在來分析這兩個程序的不同點。
從代碼的數量和簡易性角度看,兩者的差異是顯而易見的。
從理解代碼的難度看,兩門語言都有難點,但是它們的難易程度完全不同。JRuby語言的難點是第三段第5行代碼,Java語言程序的難點也是在第三段,但是Java代碼需要理解的內容明顯多了許多。我們說明一下JRuby語言的第三段代碼。這是使用了Ruby語言的代碼塊技術,它是Ruby語言中一種最常用的技術。這種技術在本書的第8章第4節中將會詳細介紹。在JRuby程序中,函數inject的參數(其中的nil)是應用于變量memo的,而對象map的每一個元素是作用于表達式“(key,value)”的。注意:參數值nil僅僅在對象map的第一個元素出現時對變量memo有作用,之后這個變量memo的值就是nil。在這里開始函數inject的參數值就是nil,因此變量memo的值始終是nil。應該說,這一實例已經是Ruby語言的代碼塊技術中復雜的實例。
從代碼記憶的角度看,每一門計算機語言都需要我們去記憶一些代碼和技巧。在JRuby程序中,最需要記憶的技巧就是第5行代碼。要是能夠很好地理解這一行代碼,那么對該方法的記憶也就很容易了。而Java語言的第三段代碼,首先需要為對象map生成一個迭代器,之后利用這個迭代器來完成對對象map的元素的獲取。
在JRuby語言中,可以利用交互工具jirb對每一行代碼進行分析,這是一件非常容易的事情。在本書的第2章第4節中詳細說明了工具jirb的使用方法。該工具的啟動命令如代碼清單1-8所示。在Windows系統的DOS窗口下輸入這個命令,會出現“ (main):001:0>”,這說明已經進入了jirb的交互環境,可以輸入JRuby語言程序代碼了。注意:這個命令已經把程序代碼清單1-7的第1行代碼包括進去了。前面已經提及過,該工具最簡單的啟動命令也可以是jirb。
代碼清單1-8交互工具jirb的啟動命令方法
jirb -rjava
接下來就可以在jirb的交互環境下輸入代碼清單1-7中第2行以后的其他代碼,結果如代碼清單1-9所示。
代碼清單1-9交互工具jirb的啟動命令操作輸出結果
irb(main):001:0>irb(main):001:0>import java.util.TreeMap => Java::JavaUtil::TreeMap irb(main):002:0>map = TreeMap.new => #<Java::JavaUtil::TreeMap:0x1b9f88b @java_object={}> irb(main):003:0>map[1] = 10 => 10 irb(main):004:0>map[21] = 12 => 12 irb(main):005:0>map.inject(nil) do |memo, (key,value)| irb(main):006:1* p memo = key+value irb(main):007:1>end 11 33 => nil irb(main):008:0>exit
1.4.2 實例二:JRuby語言代碼的靈活性
第二個實例是想說明Java語言與JRuby語言在語法方面的差異性。程序的代碼分別是代碼清單1-10和代碼清單1-11。
在代碼清單1-10的Java語言程序中,有個關鍵詞switch,而在代碼清單1-11的JRuby語言程序中也有類似的關鍵詞case,并且它們的使用方法是類似的,但是它們的功能就大不一樣。在Java語言中,switch的判斷變量(key)必須是int類型或者enum類型(這種數據類型只有Java版本5.0及其以后版本才能夠使用)。在軟件開發的實踐中,這種限制會帶來很多不便,如代碼的類型轉換等問題。而JRuby語言的關鍵詞case后面的判斷變量可以是任何類型的。JRuby語言的關鍵詞case的功能還有更多,這里就不一一細說了。
代碼清單1-10包含有關鍵詞switch的Java語言程序
public class JavaSwitch { public static void main(String[] args) { int key = 0; switch (key) { case 1: break; default: break; } } }
代碼清單1-11包含有關鍵詞case的JRuby語言程序
1 color = "red" 2 case color 3 when "red" 4 puts color 5 when "yellow" 6 puts color 7 else 8 puts "default color" 9 end
1.4.3 實例三:Java語言面向對象的不徹底性
第三個實例是想要說明一下程序語言的面向對象特點。
盡管Java語言也是號稱面向對象的計算機語言,但其實它很多地方并非如此,如Java語言的數據類型int就不是類的對象。但是Java語言也確實存在一個整數類Integer,不過這已是一種不得已的補充。
下面再給出另外一個非面向對象的Java語言代碼實例,如代碼清單1-12所示。在這個程序中,給出了一個非面向對象的類System和一個面向對象的類Runtime。程序中的兩組代碼(第一組是第3行,第二組是第4行和第5行)的功能是完全一樣的,即都是退出當前運行的程序,返回一個默認值。但是類Runtime的對象能夠做更多的事情,正如類Integer和int一樣。由此可以看出,Java語言的面向對象的特性是在不斷地被完善的。
代碼清單1-12包含類System的Java語言程序
1 public class JavaSystem { 2 public static void main(String[] args) { 3 System.exit(0); // 4 Runtime system = Runtime.getRuntime(); // 5 system.exit(0); 6 } 7 }