J2SE1.5便於開發的新語言特性:Joshua Bloch的訪談錄(5)(完)

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />看起來真的很好。您樂意跟我們介紹一下靜態導入(static import)會給開發者帶來什麼嗎?

 

它讓程序員不必在使用類的靜態成員時前綴類名。人們確實希望這樣,所以他們經常實現所謂的常數接口來達到這個效果:

 

// "Constant Interface" antipattern - do not use!

public interface Physics {

  public static final double AVOGADROS_NUMBER   = 6.02214199e23;

  public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;

  public static final double ELECTRON_MASS      = 9.10938188e-31;

}

 

public class Guacamole implements Physics {

    public static void main(String[] args) {

        double moles = ...;

        double molecules = AVOGADROS_NUMBER * moles;

        ...

    }

}

 

這是一個非常糟糕的做法:接口是用來定義類型的,不是用來定義常量的。Guacamole 使用Physics常數僅僅是一個實現細節,不應該對外開放公共的API。這樣做的結果不僅讓這個類的使用者糊塗,而且它還做了長期的承諾。即使你準備重寫Guacamole 這個類,其中不再用到這些常數,你依然必須implements這個接口。因爲這個類的使用者依賴於你的類implements Physics這個事實。

 

靜態導入(static import)提供了一個清晰的解決方案。它讓程序員使用某個類的靜態成員而不用成爲它的子類的方法。它和package import的功能很相似,不過他只是導入一個類的靜態成員,而package import則是從包中導入一個類。下面是一個例子:

 

import static org.iso.Physics.*;

 

class Guacamole {

    public static void main(String[] args) {

        double molecules = AVOGADROS_NUMBER * moles;

        ...

    }

}

 

注意,無論Physics是一個接口還是一個類,這個程序都可以正常地工作。如果它只是定義常數,那麼它就應該定義爲一個類而不是一個接口。

 

我懂了。現在您能告訴我關於元數據(metadata)的一些便利嗎?

 

這與我們討論的其它的一些特性不太相同。它同樣也可以讓開發變得更容易,不過需要工具開發商的支持。

 

現在許多API需要相當數量的樣板文件。比如,當你定義一個JAX-RPC Web Service的時候 ,你要提供一個接口和一個實現類:

 

public interface CoffeeOrderIF extends java.rmi.Remote {

    public Coffee [] getPriceList()

        throws java.rmi.RemoteException;

    public String orderCoffee(String name, int quantity)

        throws java.rmi.RemoteException;

}

 

public class CoffeeOrderImpl implements CoffeeOrderIF {

    public Coffee [] getPriceList() {

        ...

    }

    public String orderCoffee(String name, int quantity) {

        ...

   }

}

 

這個例子是直接從我們Web Services Tutorial裏面拷貝的。

如果有元數據功能的話,你就不必要手工寫所有的這些東西。你只要標記代碼讓工具知道那些代碼是可以遠程訪問的,工具就會自動生成上面的代碼。下面是一個有元數據功能支持的代碼的例子:

 

import javax.xml.rpc.*;

 

public class CoffeeOrder {

    @Remote public Coffee [] getPriceList() {

        ...

    }

    @Remote public String orderCoffee(String name, int quantity) {

        ...

    }

}

 

所有的樣本文件都沒有了!

 

嗯,確實簡潔多了。但是您不可能定義所有有用的性質並且構造所有的工具,不是嗎?

 

對,JSR-175只是提供了一個框架給其他的開發者,讓他們可以定義性質和構造工具。其他一些JSR諸如JSR-181定義了Web Services 的元數據,是定義屬性的。我們期望這個領域有更多的發展。

 

向前看,您期望未來的Java語言會有什麼新的改變?

 

這個不好說。我現在所有的精力都花在Tiger上面了,沒有時間考慮下一個變化是什麼。

 

您還想留給我們一些其他什麼信息嗎?

 

其他最重要的就是,Tiger 是一個以開發者爲中心的版本。當James Gosling 和他的團隊引入Java語言之後,Java的發展速度就像是一個起飛的火箭一樣,原因就在於它觸動了開發者的心靈,點燃了他們的熱情。這個版本的開發依然是基於這個思想。

我很幸運能有機會最早接觸這些語言的新特性,發現用它們工作是一種樂趣。我敢確信其他開發者也會這樣。在現有的各種開發語言中,Java本來就是一個非常好用而且富有生產力的語言,而所有的即將到來的新特性又會大大地增強使用它的樂趣,提高使用它進行開發的生產力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章