天天看點

《馴服爛代碼:在程式設計操練中悟道》一第3章 寫main()方法測試一下

本節書摘來自華章出版社《馴服爛代碼:在程式設計操練中悟道》一書中的第3章,作者 伍斌,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

“類圖上的所有類都實作完了。咱們現在可以寫個main()方法來測試一下了。”

先建立一個包含main()方法的類hotelworldclocksrunner。

hotelworldclocksrunner類的代碼如下所示(cm: added class hotelworldclocksrunner with a main() method to have a try.):

然後在這個類裡面寫main()方法。

main()方法的代碼如下所示(cm: added the main() method to class hotelworldclocksrunner and wrote the expected code there.):

這段代碼分3個部分,第1部分是做準備工作;第2部分是調用手機時鐘的setlocaltime()方法來設定時間為中原標準時間上午9點,以觸發所有城市時鐘的自動調整;第3部分是列印所有時鐘的本地時間。

在第1部分中,我們先建立一個具有timesubject類型的utctime執行個體;再把5個城市時鐘的執行個體都分别attach到這個utctime執行個體上,每建立一個城市時鐘執行個體,都把該城市與utc時間的時差作為構造器的參數傳進這個新建立的執行個體中。比如北京比utc時間早8小時,是以在attach北京時鐘時,用new cityclock(8)來建立北京時鐘執行個體。最後建立手機時鐘執行個體phoneclock,并把上面準備好的utctime執行個體作為構造器的參數傳進去,以便在phoneclock類的setlocaltime()方法中,調用utctime類的setutczerotime()方法,來自動調整所有城市時鐘的時間。

現在咱們先建立cityclock類的帶有時差參數的構造器。

“等等!我覺得帶有utctime參數的建立phoneclock的執行個體那句話寫得有問題。因為phoneclock和cityclock都繼承同一個父類clock,為何建立cityclock執行個體時要提供時差參數,而建立phoneclock執行個體時卻沒有提供時差參數?難道phoneclock的執行個體都不需要時差參數嗎?”

問得好!phoneclock的執行個體在建立時,确實也和建立cityclock執行個體時一樣,需要傳入當地時間與utc時間之間的時差。需要改一改這個main()方法。

修改main()方法中建立phoneclock執行個體的代碼如下所示(cm: updated the main() method to make the constructor of phoneclock is the same with cityclock and add the utctime object to the phoneclock using method phoneclock.setutctime().):

在建立phoneclock執行個體時,把中原標準時間距離utc時間的時差8作為構造器的參數傳進去,然後在phoneclock類上增加一個接口setutctime()方法,來把utctime傳給phoneclock執行個體。

“這樣應該沒問題了。再更改一下類圖,在圖中把這個更改标記為7号。”

在細化後的類圖中對7号的更改如圖3-1所示。

《馴服爛代碼:在程式設計操練中悟道》一第3章 寫main()方法測試一下

這個main()方法有不少編譯錯誤,大概有4處。

hotelworldclocksrunner類的main()方法的4處編譯錯誤如圖3-2所示。

《馴服爛代碼:在程式設計操練中悟道》一第3章 寫main()方法測試一下

現在從上往下看看這4個編譯錯誤。第1個編譯錯誤是cityclock類還沒有一個接受該城市與utc時間的時差的構造器;第2個編譯錯誤是phoneclock類也沒有接受一個其所在城市與utc時間的時差的構造器;第3個編譯錯誤是phoneclock類還沒有建立setutctime()方法;第4個編譯錯誤是utctime類還沒有建立printtimeofallclocks()方法。

接着用alt+enter快捷鍵來讓idea幫助咱們建立這些預設的構造器和方法。

現在先消除第1個編譯錯誤,建立cityclock類的帶有時差參數的構造器。

建立cityclock類的帶有時差參數的構造器的代碼如下所示(cm: added constructor cityclock(int utcoffset).):

public class cityclock extends clock {

super();

super(utcoffset);

public abstract class clock {

protected static final int utc_offset = 0;

protected static int utc_offset;

protected int localtime = 0;

public clock(int utcoffset) {

utc_offset = utcoffset;

}

public abstract void setlocaltime(int localtime);

public class phoneclock extends clock {

public phoneclock(int utcoffset) {

+

utctime.attach("newyork", new cityclock(-5));

clock phoneclock = new phoneclock(8);

phoneclock phoneclock = new phoneclock(8);

public class hotelworldclocksrunner {

timesubject utctime = new utctime();

utctime utctime = new utctime();

super.localtime = localtime;

public void setutctime(utctime utctime) {

this.utctime = utctime;

clock.setlocaltime(clock.tolocaltime(this.utczerotime));

public void printtimeofallclocks() {

for (string clockname : super.clocks.keyset()) {

system.out.println(clockname + ": " + super.clocks.get(clockname).gettime());

public static int tolocaltime(int utczerotime) {

public string gettime() {

return string.valueof(this.localtime);

繼續閱讀