本節書摘來自華章出版社《馴服爛代碼:在程式設計操練中悟道》一書中的第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所示。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLzQGN2UzY0UjY3I2MwADZiBjY1UzMilTZzEGOyIzMxQTZyU2YlZTZ28CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
這個main()方法有不少編譯錯誤,大概有4處。
hotelworldclocksrunner類的main()方法的4處編譯錯誤如圖3-2所示。
現在從上往下看看這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);