在一个偶然(闲着无聊)的过程中,突然非常好奇为什么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了,为此就多了至少一步的工作量了。
个人感觉,知识点这种东西,不应该去给它打上“过时”或是“潮流”的标签。那些被我们打上“过时”的标签的代码设计方式,它只是在当下的环境中,用的比较少或是有更好的替代品而已。你不应该也不能将它“打入冷宫”,只要你记得它,它总是有一天能给你帮上忙的。