在一個偶然(閑着無聊)的過程中,突然非常好奇為什么LinearLayout在不指定排列方向為垂直(VERTICAL)時就得是水平方向(HORIZONTAL)排列的。產生這個疑問的時候腦子里蹦出來的第一個回答就是:肯定是LinearLayout在實例化過程中指定了它的默認值為HORIZONTAL。反正這會閑着也是閑着,不墨跡,看源碼!!!
在LinearLayout的源碼(Android4.4)中找到setOrientation()方法的實現如下圖所示。
圖1 setOrientation的實現
嗯,夠簡單粗暴,代碼就該這樣寫!在LinearLayout中關於元素排列方向,就只是用一個int型的變量來表示而已。
圖2 表示元素排列方向的變量定義
接下來為了驗證自己之前的猜想:在LinearLayout實例化過程中設置了它的默認排列方向為水平方向。於是開始搜索LinearLayout中關於mOrientation變量的賦值操作。
圖3 LinearLayout中mOrientation的hits
發現出了在1683行中在setOrientation()方法中有一次賦值操作外,就不再有任何的其它賦值操作了。LinearLayout在實例化過程中並沒有去指定元素排列方向為HORIZONTAL啊,那它是如何保證默認值為HORIZONTAL的?等等,mOrientation是int型變量,全局int型變量默認值是0的。我們去看看HORIZONTAL與VERTICAL靜態變量的本質是什么。
圖4 HORIZONTAL與VERTICAL的定義
果不其然。LinearLayout在實例化過程中根本不需要顯示地去指定它的元素排列方向為水平。 在LinearLayout中元素水平排列是它與生俱來的特性。
這個小知識點雖然簡單到不能算是知識點。但是我卻實實在在地被震撼到了。因為在這里,我見到了一個“優雅的程序設計”活生生的例子。只要我們的程序在編寫之初能有一個好的“設計藍圖”確實是能幫我們省卻不少工作量的,同時還能提升他人的閱讀體驗,讓閱讀者對程序設計者感到佩服。
在我個人接受的關於面向對象編程的傳統教育中,都是不太提倡使用整型來做一些常量啊或其它標識類型的定義的,因為它不好管理,也不太直觀。在這個地方,如果換成我來寫的話,我有可能會將HORIZONTAL與VERTICAL設計成枚舉類型來定義。如此一來的話,在LinearLayout實例化過程中可能就不得不要顯示地指定mOrientation變量的值為HORIZONTAL了,為此就多了至少一步的工作量了。
個人感覺,知識點這種東西,不應該去給它打上“過時”或是“潮流”的標簽。那些被我們打上“過時”的標簽的代碼設計方式,它只是在當下的環境中,用的比較少或是有更好的替代品而已。你不應該也不能將它“打入冷宮”,只要你記得它,它總是有一天能給你幫上忙的。