? ? ? ? 作為一名Android 開(kāi)發(fā)者典予,掌握J(rèn)ava相關(guān)知識(shí)是毋容置疑的。在掌握的基礎(chǔ)上乐严,根據(jù)使用場(chǎng)景選擇適當(dāng)方式瘤袖,不僅能夠大大降低bug出現(xiàn)概率,對(duì)代碼性能昂验,代碼編寫風(fēng)格都有一定程度上的提高與改善捂敌。
? ? ? ? 以下問(wèn)題主要來(lái)自日常開(kāi)發(fā),codeView既琴,靜態(tài)代碼檢查幾個(gè)方面占婉,覺(jué)得很有必要總結(jié)一下,作為一份checklist甫恩,供日后瀏覽查閱逆济。
(1)transient關(guān)鍵字和@Transisent注解
? ? ? ?通常使用transient關(guān)鍵字去修飾對(duì)象的某個(gè)域或者多個(gè)域,當(dāng)該對(duì)象進(jìn)行Serializable序列化時(shí),這些被transient關(guān)鍵字修飾的域奖慌,將不會(huì)被序列化霎终,這些域僅僅保留在內(nèi)存中,不會(huì)進(jìn)行持久化操作(如寫磁盤升薯、寫DB)莱褒。
? ? ? ? 有些時(shí)候因?yàn)闃I(yè)務(wù)要求,需要添加一些非數(shù)據(jù)庫(kù)實(shí)體類的字段涎劈,用來(lái)存儲(chǔ)臨時(shí)數(shù)據(jù)广凸。此時(shí),可以使用@Transient注解來(lái)標(biāo)注這些字段蛛枚。因?yàn)锧Transient標(biāo)注的字段只是用來(lái)臨時(shí)存數(shù)據(jù)的谅海,在數(shù)據(jù)庫(kù)表中,沒(méi)有相應(yīng)的字段映射蹦浦,因此扭吁,ORM框架將忽略該屬性。
兩者區(qū)別:
從上面的介紹可知盲镶,被transient關(guān)鍵字修飾的域 在 Serializable 序列化 和DB過(guò)程中不會(huì)起作用侥袜;
而被@Transient注解標(biāo)注的域僅僅在DB過(guò)程中不被序列化,這是兩者最大的區(qū)別溉贿。
使用注意事項(xiàng):
1)使用transient關(guān)鍵字修飾某個(gè)對(duì)象的域時(shí)枫吧,一定要確保該對(duì)象實(shí)現(xiàn)了Serializable接口,不然不起作用
2)對(duì)static域不管使不使用transient關(guān)鍵字修飾宇色,該靜態(tài)域都不會(huì)被序列化
(2)對(duì)Java浮點(diǎn)型的理解
? ? ? ?總所周知九杂,在Android 開(kāi)發(fā)過(guò)程中盡量少進(jìn)行浮點(diǎn)型運(yùn)算蘸吓,一是性能問(wèn)題维哈,二是精度損失。計(jì)算機(jī)的運(yùn)算都是采用二進(jìn)制進(jìn)行的邮绿,因此抢蚀,計(jì)算機(jī)表示浮點(diǎn)型都存在精度限制镀层,會(huì)導(dǎo)致一系列問(wèn)題,如判斷兩個(gè)float型數(shù)據(jù)是否相等思币、double型數(shù)據(jù)保留兩位小數(shù)鹿响。
1)判斷兩個(gè)float型數(shù)據(jù)相等常用辦法
一般不會(huì)直接使用“==”或“!=”進(jìn)行判斷羡微,而是直接使用兩個(gè)float的絕對(duì)差值是否大于0谷饿,進(jìn)行判斷,如下:
不是判斷Math.abs(xx)>0 就可以了嗎妈倔,為什么還要弄一個(gè)1e-6博投?
原因:在實(shí)際過(guò)程中,允許一定的精度誤差盯蝴,1e-6就是自己定義的一個(gè)可接受的誤差范圍
2)double型數(shù)據(jù)保留n位小數(shù)
具體原理毅哗,大家可以參考下面這篇博文 java保留兩位小數(shù)听怕。
(3)Collections.unmodifiableSet/List/Map工具方法
? ? ? ?Collections 工具類主要針對(duì)Set、List虑绵、Map等集合尿瞭,提供了大量方法,如排序翅睛、查詢声搁、修改,另外還提供了將集合對(duì)象置為不可變捕发、對(duì)集合對(duì)象實(shí)現(xiàn)同步控制等方法疏旨。
? ? ? 本文只講Collections將集合對(duì)象設(shè)置成為不可變對(duì)象。
目標(biāo)集合 :Set扎酷、List檐涝、Map三個(gè)集合
(1)emptyXxx()
? ? ? ? ?返回一個(gè)空的、不可變的集合對(duì)象法挨;
(2)singletonXxx()
? ? ? ? ?返回一個(gè)只包含指定對(duì)象(只有一個(gè)或一個(gè)元素)的不可變的集合對(duì)象谁榜;
(3)unmodifiableXxx()
? ? ? ? ?返回指定集合對(duì)象的不可變視圖;
舉例:
sData 后面就不能進(jìn)行add 凡纳,remove等操作了惰爬。
(4)是否一定要使用注解代替枚舉
?1)常量方式
常量方式缺點(diǎn):類型不安全,方法調(diào)用者
使用者可以隨意傳入downloadScene值惫企,有可能誤傳撕瞧,導(dǎo)致相關(guān)功能失效
2)枚舉方式
枚舉作為值限定狀態(tài)
枚舉將常量組織起來(lái),便于統(tǒng)一管理
枚舉方式缺點(diǎn):枚舉存在性能問(wèn)題狞尔,Google Android 不建議使用枚舉(后面解釋)
3)Interface方式實(shí)現(xiàn)
接口中成員變量丛版,默認(rèn)是 public static final 型;將其定義成接口方式偏序,也可以達(dá)到控制常量范圍的作用页畦。
4)注解方式
按照上面的說(shuō)法,是不是都需要將枚舉型更換成注解型了研儒?
回答當(dāng)然是:NO
枚舉不添加任何方法豫缨,枚舉值默認(rèn)從0開(kāi)始,但是有些時(shí)候需要將枚舉常量與數(shù)據(jù)關(guān)聯(lián)起來(lái)
當(dāng)枚舉常量需要和數(shù)據(jù)關(guān)聯(lián)時(shí)候端朵,直接使用枚舉簡(jiǎn)單有效
如:企鵝FM音速?gòu)棇硬藛魏冒牛枰峁?.5倍、1倍冲呢、1.5倍舍败、2倍播放速度
此時(shí),枚舉定義及相關(guān)數(shù)據(jù)轉(zhuǎn)化都相當(dāng)方便(如圖所示)
關(guān)于枚舉性能問(wèn)題
大家可以去看看
枚舉帶來(lái)的性能問(wèn)題可以忽略
明顯指出enum性能問(wèn)題
? ? ? ?綜上可知,除了方法1)之外邻薯,我們可以根據(jù)適合的場(chǎng)景選擇合適的方法裙戏,在代碼出錯(cuò)率、性能厕诡、優(yōu)雅程度方面達(dá)到一個(gè)平衡累榜。
(5)Object.toString( )和String.valueOf(Object ?value)
? ? ? ?在Android 開(kāi)發(fā)中,很多時(shí)候需要將Object對(duì)象轉(zhuǎn)換成String灵嫌,目前一般有三種處理方法信柿,分別是Object.toString()/valueOf(Object)/(String)Object ( 強(qiáng)轉(zhuǎn)不推薦)。
1)Object.toString( )
需要保證Object非空 醒第,不然會(huì)導(dǎo)致np(NullPointerException)問(wèn)題
2) valueOf(Object ?value)
放心大膽直接使用valueOf()渔嚷,原因如圖所示,valueOf()為String 的一個(gè)靜態(tài)方法稠曼,內(nèi)部已經(jīng)做了判空處理形病,不用擔(dān)心np問(wèn)題的發(fā)生
ValueOf()速度問(wèn)題,可以忽略
(6)對(duì)象創(chuàng)建原則
對(duì)象創(chuàng)建主要有以下幾點(diǎn):
1)該對(duì)象是否需要設(shè)計(jì)成單例霞幅;
2)對(duì)象在使用時(shí)漠吻,再創(chuàng)建(懶加載原則)
3)對(duì)象創(chuàng)建,最好不要放在for司恳、while等循環(huán)中及重復(fù)調(diào)用的方法中
(7)私有構(gòu)造函數(shù)的妙用
總所周知:java是允許寫私有構(gòu)造函數(shù)的途乃;java類默認(rèn)有一個(gè)不帶參數(shù)的public構(gòu)造函數(shù);
使用private修飾構(gòu)造函數(shù)的目的扔傅,就是使該類無(wú)法在其他類中實(shí)例化(防止實(shí)例化)耍共。
目前主要使用在:?jiǎn)卫J健uilder模式及一些方法工具類中(防止其他使用者濫用)
? 暫時(shí)就寫這么多了 猎塞,歡迎大家指出不足之處或錯(cuò)誤试读,^_^!