官术网_书友最值得收藏!

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  }
主站蜘蛛池模板: 旌德县| 东乡| 台中县| 正阳县| 海城市| 鸡东县| 浦东新区| 东源县| 铜陵市| 文安县| 泗水县| 瓦房店市| 新和县| 南平市| 新竹市| 仙游县| 锦屏县| 台前县| 肇庆市| 苗栗市| 鸡西市| 五指山市| 上饶市| 龙里县| 水富县| 泸州市| 南华县| 葫芦岛市| 永康市| 龙海市| 南安市| 马公市| 江孜县| 定襄县| 民乐县| 嘉义市| 池州市| 涞源县| 施甸县| 准格尔旗| 云阳县|