999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

關于Java中final的深度剖析

2010-01-01 00:00:00陸添超
電腦知識與技術 2010年6期

摘要:在Java語言的使用中,經常困擾程序員的一件事就是代碼中的邏輯錯誤難以定位,從而降低了工作效率。final關鍵詞的用法能在很大程度上解決這一類的問題,將邏輯錯誤轉換為編譯器能夠識別的編譯錯誤。在Java編程中將final作為一種規范將使整個項目變得更加便于管理,也更利于后期的測試和維護。

關鍵詞:Java;final;邏輯錯誤;編譯時替換;常量

The Use of Final in Java Programming

LU Tian-chao

(School of Computer Science and Technology, China University of Mining and Technology, Xuzhou 221116, China)

Abstract: In the programming of Java,it is important to ensure the precision of the code.Unfortunately,this job is really hard for most engineers.But the use of final may reduce the difficulty to some degree.It exchanges logic errors with compiler errors when you introduce this tactic.

Key words: constant; final; logic errors; substitution at compile time

在Java語言的使用中,代碼的一致性與健壯性一直是廣泛Java程序員尤其是經驗豐富的程序員所關注的焦點,在工程項目中這將是決定團隊合作成功與否的一個不可忽視的因素。而且有這么一種說法:邏輯錯誤比編譯錯誤可怕一百倍。的確是這樣,絕大多數的編譯環境都能準確的定位到編譯錯誤,而對于邏輯錯誤就沒這么輕松了,特別是在大型的項目中,往往程序員要花費整個下午甚至好幾天的時間來找出并解決隱藏著的邏輯錯誤。而恰當的使用final將幫助你輕松的解決邏輯錯誤從而為你節省下大量的時間和精力,與此同時也更好的解決了代碼的一致性與健壯性問題。

1 final的使用

1.1 常量

這是final最普通的用法。對于某一數據如果在多處被使用,而且這個數據不允許被改變,那么使用final來聲明一個常量是非常合適的。例如圓周率∏,如果在使用數字3.14之前就聲明pulic final static double PI=3.14,那么當你寫不同的函數來返回圓的周長、面積、體積等數學量時直接在表達式中使用PI即可,這樣做的好處有:

1)增強代碼的可讀性。使用數字和使用有意義的單詞顯然后者更易被讀懂。

2)避免了不必要的邏輯錯誤。如果在本來應該是3.14的地方被寫成了3.24,那么返回的結果顯然是錯的,而使用常量則可避免這種錯誤,因為所有應該是3.14的地方都被PI代替了。即使PI被拼錯了,編譯器也能立即提示錯誤信息,這樣不費吹灰之力就能將錯誤改正。

3)常量值改變時只需修改常量的定義而不用一處處的找出來修改。這里有一個值得注意的地方,如果在多個文件中都用到了同一個常量,那么涉及到的文件應該全部被重新編譯,否則常量的修改只會在被重新編譯過的文件中生效。具體原因是被final定義的常量都是在編譯時被替換成具體值的,這一點應該重視,這也是常量區別于變量的一個地方,因為變量是在運行時被替換的。

1.2 方法域中的常變量

這種使用final的方法初看似乎很奇怪,但是如果恰當的使用這種方法,常常能起到意料之外的奇特效果。首先來看一下下面這個例子:

public static String testMethod(final String subfix){

final String key=”prev”+subfix;

return key;

}

這是常變量的第一種用法,你希望在你的方法中有一個變量的值能夠由傳入的參數決定,但是你又希望這個變量一旦被賦值后在程序運行過程中就不允許被改變,那么常變量將是非常好的選擇。使用這種方法的好處有:

1)避免了邏輯錯誤。試想,如果在方法中的某處你一不小心把本來不允許被改變的變量改變了,那么有可能你就要花費相當長的時間去找出這個bug,因為編譯器是不會報錯的。但是使用final限定這個變量后,一旦這個變量被初始化,它就不允許人為的改變,如果你真的改變了它的值,編譯器會給出這樣的錯誤提示:cannot assign a value to final variable。

2)不失靈活性。因為這樣定義的常變量允許每次被調用的時候都被傳入參數賦予不同的值,只是在運行階段它的值不允許被改變而已。

另外還有一種更加靈活的方法,請看下面這段程序:

public void testMethod(final String name){

final String msg;

if(name==1){msg=”parameter error!”;}

else{msg=”no problem!”;}

//假如你在這個地方篡改msg將會報錯,

//例如msg=”error”,編譯器會報錯

System.println(msg);

}

這種方法的用法和前面的方法類似,只不過允許先不初始化final變量,等到合適的時候再賦值,一旦被賦值,變量的值就不允許再改變。

1.3 用final聲明實例域中的數據成員

與方法域中的常變量類似,為了避免邏輯錯誤,可以在聲明數據成員時增加final聲明,這樣如果不小心將賦值對象搞錯,錯誤能快速的被編譯器定位。請看這個例子:

public class testClass{

private final String creation=new String();

private String target=creation;

public void testMethod(String modifcation){

if(modification==1){System.println(“error!”);}

else {creation=modification;}//本來是要給target賦值的,

//卻賦給了creation,不過由于有final聲明,編譯器能報錯,

//避免了不必要的時間浪費

}}

1.4 常量參數

就像前面舉過的例子中,把傳入參數都用final來限定,這種用法即所謂的常量參數。為了說明這種final使用方法的好處,我們先來看一個反面的例子:

public testMethod(int input){

int resultInput;

if(input<0)resultInput=1;

if(input=0)input=2;//這里本來是要給resultInput

//賦值的,結果錯賦給了input

if(input>0)resultInput=3;

}

本來是要根據input的值來決定resultInput的取值,結果在第二個if判斷后卻將值錯賦給了input導致第三個if語句的執行。當然這里只是為了說明情況,實際中情況往往比這復雜好幾倍,到那時可能就要為這種低級錯誤付出慘痛的代價了。為了避免這種情況的發生,只需要很簡單的一筆,即將第一行的聲明改為public testMethod(final int input)。

一旦傳入的參數被聲明為final那么參數的值在函數體中就不允許被改變。如果像上面這樣的低級錯誤發生了,編譯器會準確定位到這個錯誤并報錯,這樣一來就能節省下程序員很多寶貴的時間。

1.5 不可更改的集合對象

如果希望某一個集合對象是不可更改的,即初始化之后就不能對這個對象進行任何更改,那么可以考慮使用final來聲明這個集合對象,例如final Set testSet=new HashSet()。但是這樣做所做到的只是對于testSet這個對象不能再更改,對于testSet中存儲的數據集合仍然可以隨意更改。請看下面這個例子:

public class transport{

private final static Set tranSet;

public transport(){

tranSet=new HashSet();

tranSet.add(“bus”);//可以更改,不會報錯

tranSet.add(“plane”);//可以更改,不會報錯

tranSet.add(“bike”);//可以更改,不會報錯

}

public void someMethod(){

tranSet.add(“train”);//仍然可以更改,不會報錯

tranSet=new Set();//不能更改,報錯

}}

可以看出,使用final來聲明集合對象僅僅能起到限制集合對象的作用,不能限制集合中的數據。想要限制集合中的數據,要用到Collections類的方法unmodifiableSet(Set exp)。對于上面的例子,只要修改一下構造函數transport()。

public transport(){

temp=new HashSet();

temp.add(“bus”);//可以更改,不會報錯

temp.add(“plane”);//可以更改,不會報錯

temp.add(“bike”);//可以更改,不會報錯

tranSet=Collections. unmodifiableSet(temp);

}

這樣對于方法someMethod()中的所有修改將會被限制,如果tranSet.add(“train”)被執行將會拋出一個UnsupportedOperationException的異常。

1.6 用final聲明不允許被繼承的類

一旦某一個類被聲明為final,那么以后任何其他的類都不能繼承這個類。當然,為了達到類不被繼承的目的還有一種隱式定義的方法,即將所有的構造函數都聲明為private。為了說明問題,舉這樣兩個例子,對于同一個類使用兩種方法達到同一目的:

1) public final class object{//使用final聲明類不允許被繼承

float x,y;

public object()//構造函數為public

{x=0;y=0;}

}

2) public class object{//不使用final聲明類

float x,y;

private object()//構造函數為private

{x=0;y=0;}

}

1.7 用final聲明函數

使用final來聲明不允許被繼承的類固然達到了保護類的目的,但是大多數情況下我們只是希望類中的某些方法不允許被重載,從而達到保護類的完整性和安全性的目的。于是使用final來聲明類內的方法將提供一種便捷的保護機制。這樣以后被聲明為final的函數將不允許被子類重載,因而避免了可能引起的非法操作。

2 結論

正確恰當的使用final對于Java程序員來說絕對是非常重要的技巧。大家都知道Java是一門對于程序員的經驗和技巧要求都很高的語言,效率和安全性是需要程序員深思熟慮的問題。恰當的使用final將為我們省下寶貴的時間來優化程序的效率,同時為代碼的安全穩健提供了保障。對于大型的項目來說邏輯錯誤絕對是一個不可忽視的問題,而final提供了一種將邏輯錯誤轉換為編譯錯誤的方法,從而減輕了查錯的代價。因而讓final成為一種編程規范也是合情合理的建議。

參考文獻:

[1] Jr Simmons R.Hardcore Java[M].O'Reilly Media,Inc,2005.

[2] 埃克爾.Java編程思想[M].陳昊鵬,譯.北京:機械工業出版社,2007.

[3] 孫衛琴.Java面向對象編程[M].北京:電子工業出版社,2006.

[4] 昊斯特曼.Java核心技術[M].葉乃文,鄺勁筠,杜永萍,譯.北京:機械工業出版社,2007.

[5] 梁著.Java語言程序設計基礎篇[M].萬波,譯.北京:機械工業出版社,2008.

[6] 高宏靜.Java從入門到精通[M].北京:化學工業出版社,2009.

[7] 龐永慶.21天學通Java[M].北京:電子工業出版社,2009.

[8] 辛運幃.Java程序設計[M].2版.北京:清華大學出版社,2006.

主站蜘蛛池模板: 婷婷六月综合网| 一级爱做片免费观看久久| 久青草免费在线视频| 国产美女叼嘿视频免费看| a级毛片免费在线观看| 第一区免费在线观看| a毛片免费看| 精品伊人久久久久7777人| av在线5g无码天天| 一本大道东京热无码av| 国产成人一区二区| 国产另类乱子伦精品免费女| 免费一级全黄少妇性色生活片| 特级做a爰片毛片免费69| 欧洲亚洲欧美国产日本高清| 免费无遮挡AV| 好吊妞欧美视频免费| 伊人蕉久影院| 成人福利视频网| 久久无码免费束人妻| 亚洲天堂区| 直接黄91麻豆网站| 一本一道波多野结衣av黑人在线 | 蜜桃臀无码内射一区二区三区| 色久综合在线| 久久天天躁狠狠躁夜夜躁| 亚洲经典在线中文字幕| 国产精品久久久久久久久kt| a毛片在线免费观看| 国产成人亚洲欧美激情| 91视频首页| 欧美成人午夜视频免看| 国产日本欧美亚洲精品视| 广东一级毛片| 九九热精品免费视频| 青青草91视频| 精品无码一区二区三区电影| 99国产在线视频| 国产国语一级毛片在线视频| 久久国产精品嫖妓| 亚洲成人精品| 久久久久九九精品影院| 国产精品九九视频| 亚洲一区精品视频在线| 精品自窥自偷在线看| 色噜噜综合网| 久久综合亚洲色一区二区三区| 色天天综合久久久久综合片| 亚洲欧洲自拍拍偷午夜色无码| 精品国产自在现线看久久| 亚洲免费黄色网| 日韩A∨精品日韩精品无码| 欧美国产在线一区| 蜜臀av性久久久久蜜臀aⅴ麻豆| 精品久久777| 超清人妻系列无码专区| 国产va视频| 97亚洲色综久久精品| 精品欧美视频| 99热最新在线| 国产产在线精品亚洲aavv| 亚洲大尺码专区影院| 2020国产精品视频| 国产手机在线ΑⅤ片无码观看| 一区二区日韩国产精久久| 国产精鲁鲁网在线视频| 免费A级毛片无码无遮挡| 亚洲AV无码一区二区三区牲色| 精品国产成人a在线观看| 日本欧美视频在线观看| 强乱中文字幕在线播放不卡| 天天综合色天天综合网| 国产亚洲欧美在线中文bt天堂| 久久久四虎成人永久免费网站| 91视频99| 一区二区欧美日韩高清免费| 青青青草国产| 无码内射中文字幕岛国片| 国产乱子伦视频三区| 国模沟沟一区二区三区| 97成人在线观看| 不卡色老大久久综合网|