在經細節處理後,一個組件在類中被獨特的具體化,真正地成為一塊代碼。關鍵的爭議在於應用程序構建工具發現組件的屬性和事件能力。為了創建一個VB組件,程序開發者不得不編寫正確的同時也是復雜煩瑣的代碼片,接下來由某些協議去展現它們的事件和屬性。Delphi是第二代的可視化編程工具並且這種開發語言主動地圍繞可視化編程來設計因此它更容易去創建一個可視化組件。但是,Java帶來了可視化的創作組件做為Java Beans最高級的“裝備”,因為一個Bean就是一個類。我們不必再為制造任何的Bean而編寫一些特殊的代碼或者使用特殊的編程語言。事實上,我們唯一需要做的是略微地修改我們對我們方法命名的辦法。方法名通知應用程序構建工具是否是一個屬性,一個事件或是一個普通的方法。
在Java的文件中,命名規則被錯誤地曲解為“設計范式”。這十分的不幸,因為設計范式(參見第16章)惹來不少的麻煩。命名規則不是設計范式,它是相當的簡單:
(1) 因為屬性被命名為xxx,我們代表性的創建兩個方法:getXxx()和setXxx()。注意get或set後的第一個字母小寫以產生屬性名。“get”和“set”方法產生同樣類型的自變量。“set”和“get”的屬性名和類型名之間沒有關系。
(2) 對於布爾邏輯型屬性,我們可以使用上面的“get”和“set”方法,但我們也可以用“is”代替“ get”。
(3) Bean的普通方法不適合上面的命名規則,但它們是公用的。
4.對於事件,我們使用“listener(接收器)”方法。這種方法完全同我們看到過的方法相同:(addFooBarListener(FooBarListener)和removeFooBarListener(FooBarListener)方法用來處理FooBar事件。大多數時候內建的事件和接收器會滿足我們的需要,但我們可以創建自己的事件和接收器接口。
上面的第一點回答了一個關於我們可能注意到的從Java 1.0到Java 1.1的改變的問題:一些方法的名字太過於短小,顯然改寫名字毫無意義。現在我們可以看到為了制造Bean中的特殊的組件,大多數的這些修改不得不適合於“get”和“set”命名規則。
現在,我們已經可以利用上面的這些指導方針去創建一個簡單的Bean:
//: Frog.java // A trivial Java Bean package frogbean; import java.awt.*; import java.awt.event.*; class Spots {} public class Frog { private int jumps; private Color color; private Spots spots; private boolean jmpr; public int getJumps() { return jumps; } public void setJumps(int newJumps) { jumps = newJumps; } public Color getColor() { return color; } public void setColor(Color newColor) { color = newColor; } public Spots getSpots() { return spots; } public void setSpots(Spots newSpots) { spots = newSpots; } public boolean isJumper() { return jmpr; } public void setJumper(boolean j) { jmpr = j; } public void addActionListener( ActionListener l) { //... } public void removeActionListener( ActionListener l) { // ... } public void addKeyListener(KeyListener l) { // ... } public void removeKeyListener(KeyListener l) { // ... } // An "ordinary" public method: public void croak() { System.out.println("Ribbet!"); } } ///:~
首先,我們可看到Bean就是一個類。通常,所有我們的字段會被作為專用,並且可以接近的唯一辦法是通過方法。緊接著的是命名規則,屬性是jump,color,jumper,spots(注意這些修改是在第一個字母在屬性名的情況下進行的)。雖然內部確定的名字同最早的三個例子的屬性名一樣,在jumper中我們可以看到屬性名不會強迫我們使用任何特殊的內部可變的名字(或者,真的擁有一些內部的可變的屬性名)。
Bean事件的句柄是ActionEvent和KeyEvent,這是根據有關接收器的“add”和“remove”命名方法得出的。最後我們可以注意到普通的方法croak()一直是Bean的一部分,僅僅是因為它是一個公共的方法,而不是因為它符合一些命名規則。