Java常量定義需要注意的兩點(diǎn)
在任何開發(fā)語言中,都需要定義常量。在Java開發(fā)語言平臺(tái)中也不例外。不過在Java常量定義的時(shí)候,跟其他語言有所不同。其有自己的特色。在這篇文章中,主要針對(duì)Java語言中定義常量的注意事項(xiàng)進(jìn)行解析,幫助各位程序開發(fā)人員更好的掌握常量的定義與管理工作。
一、常量定義的基本注意事項(xiàng)
在Java語言中,主要是利用final關(guān)鍵字(在Java類中靈活使用Static關(guān)鍵字)來進(jìn)行Java常量定義。當(dāng)常量被設(shè)定后,一般情況下就不允許再進(jìn)行更改。如可以利用如下的形式來定義一個(gè)常量:final double PI=3.1315。在定義這個(gè)常量時(shí),需要注意如下內(nèi)容:
一是Java常量定義的時(shí)候,就需要對(duì)常量進(jìn)行初始化。也就是說,必須要在常量聲明時(shí)對(duì)其進(jìn)行初始化。都跟局部變量或者成員變量不同。當(dāng)在常量定義的時(shí)候初始化過后,在應(yīng)用程序中就無法再次對(duì)這個(gè)常量進(jìn)行賦值。如果強(qiáng)行賦值的話,數(shù)據(jù)庫會(huì)跳出錯(cuò)誤信息,并拒絕接受這一個(gè)新的值。
二是final關(guān)鍵字使用的范圍。這個(gè)final關(guān)鍵字不僅可以用來修飾基本數(shù)據(jù)類型的常量,還可以用來修飾對(duì)象的引用或者方法。如數(shù)組就是一個(gè)對(duì)象引用。為此可以使用final關(guān)鍵字來定義一個(gè)常量的數(shù)組。這就是Java語言中一個(gè)很大的特色。一旦一個(gè)數(shù)組對(duì)象被final關(guān)鍵字設(shè)置為常量數(shù)組之后,它只能夠恒定的指向一個(gè)數(shù)組對(duì)象,無法將其改變指向另外一個(gè)對(duì)象,也無法更改數(shù)組(有序數(shù)組的插入方法可使用的二分查找算法)中的值。
三是需要注意常量的命名規(guī)則。不同的語言,在定義變量或者常量的時(shí)候,都有自己一套編碼規(guī)則。這主要是為了提高代碼的共享程度與提高代碼的易讀性。在Java常量定義的時(shí)候,也有自己的一套規(guī)則。如在給常量取名的時(shí)候,一般都用大寫字符。在Java語言中,大小寫字符是敏感的。之所以采用大寫字符,主要是跟變量進(jìn)行區(qū)分。雖然說給常量取名時(shí)采用小寫字符,也不會(huì)有語法上的錯(cuò)誤。但是,為了在編寫代碼時(shí)能夠一目了然的判斷變量與常量,***還是能夠?qū)⒊A吭O(shè)置為大寫字符。另外,在常量中,往往通過下劃線來分隔不同的字符。而不想對(duì)象名或者類名那樣,通過首字符大寫的方式來進(jìn)行分隔。這些規(guī)則雖然不是強(qiáng)制性的規(guī)則,但是為了提高代碼友好性,方便開發(fā)團(tuán)隊(duì)中的其他成員閱讀,這些規(guī)則還是需要遵守的。沒有規(guī)矩,不成方圓。
總之,Java開發(fā)人員需要注意,被定義為final的常量需要采用大寫字母命名,并且中間***使用下劃線作為分隔符來進(jìn)行連接多個(gè)單詞。在定義final的數(shù)據(jù)不論是常量、對(duì)象引用還是數(shù)組,在主函數(shù)中都不可以改變。否則的話,會(huì)被編輯器拒絕并提示錯(cuò)誤信息。
二、Final關(guān)鍵字與static關(guān)鍵字同時(shí)使用
由于Javal是面向?qū)ο蟮恼Z言,所以在Java常量定義的時(shí)候還有與其它編程語言不同的地方。如一段程序代碼從編輯到***執(zhí)行,即使需要經(jīng)過兩個(gè)過程,分別為代碼的裝載與對(duì)象的建立。不同的過程對(duì)于常量的影響是不同的?,F(xiàn)在假設(shè)有如下的代碼:
- Private static Random rd1=new Random(); //實(shí)例化一個(gè)隨機(jī)數(shù)生成對(duì)象。
- Private final int int1=rd1.nestInt(10); //生成隨機(jī)數(shù)并賦值給常量int1
- Private static final int int2=rd1.nestInt(10); //生成隨機(jī)數(shù)并賦值給常量int2
這上面的語句的大致含義是,通過Java語言提供的隨機(jī)數(shù)類對(duì)象,生成隨機(jī)數(shù)。并把生成的隨機(jī)數(shù)賦值給常量int1與int2。細(xì)心的讀者會(huì)發(fā)現(xiàn),雖然同樣是賦值語句,但是以上兩個(gè)語句中有一個(gè)細(xì)小的差別,即在第二條語句中多了一個(gè)關(guān)鍵字static。關(guān)于關(guān)鍵字的用途,筆者在以前的文章中也有談到過。這個(gè)是一個(gè)靜態(tài)的概念。即當(dāng)利用這個(gè)關(guān)鍵字來修飾一個(gè)變量的時(shí)候,在創(chuàng)建對(duì)象之前就會(huì)為這個(gè)變量在內(nèi)存中創(chuàng)建一個(gè)存儲(chǔ)空間。以后創(chuàng)建對(duì)對(duì)象如果需要用到這個(gè)靜態(tài)變量,那么就會(huì)共享這一個(gè)變量的存儲(chǔ)空間。也就是說,在創(chuàng)建對(duì)象的時(shí)候,如果用到這個(gè)變量,那么系統(tǒng)不會(huì)為其再分配一個(gè)存儲(chǔ)空間,而只是將這個(gè)內(nèi)存存儲(chǔ)空間的地址賦值給他。如此做的好處就是可以讓多個(gè)對(duì)象采用相同的初始變量。當(dāng)需要改變多個(gè)對(duì)象中變量值的時(shí)候,只需要改變一次即可。從這個(gè)特性上來說,其跟常量的作用比較類似。不過其并不能夠取代常量的作用。
那么以上兩條語句有什么差別嗎?我們首先來看Private final int int1=rd1.nestInt(10)這條語句。雖然int1也是一個(gè)常量,但是其是在對(duì)象建立的時(shí)候初始化的。如現(xiàn)在需要?jiǎng)?chuàng)建兩個(gè)對(duì)象,那么需要對(duì)這個(gè)變量初始化兩次。而在兩次對(duì)象初始化的過程中,由于生成的隨機(jī)數(shù)不同,所以常量初始化的值也不同。***導(dǎo)致的結(jié)果就是,雖然int1是常量,但是在不同對(duì)象中,其值有可能是不同的??梢?,使用final的Java常量定義并不是恒定不變的。因?yàn)槟J(rèn)情況下,定義的常量是在對(duì)象建立的時(shí)候被初始化。如果在建立常量時(shí),直接賦一個(gè)固定的值,而不是通過其他對(duì)象或者函數(shù)來賦值,那么這個(gè)常量的值就是恒定不變的,即在多個(gè)對(duì)象中值也使相同的。但是如果在給常量賦值的時(shí)候,采用的是一些函數(shù)或者對(duì)象(如生成隨機(jī)數(shù)的Random對(duì)象),那么每次建立對(duì)象時(shí)其給常量的初始化值就有可能不同。這往往是程序開發(fā)人員不原意看到的。有時(shí)候程序開發(fā)人員希望建立再多的對(duì)象,其在多個(gè)對(duì)象中引用常量的值都是相同的。
要是現(xiàn)這個(gè)需求的話,有兩個(gè)方法。一是在給常量賦值的時(shí)候,直接賦予一個(gè)固定的值,如abcd等等。而不是一個(gè)會(huì)根據(jù)環(huán)境變化的函數(shù)或者對(duì)象。像生成隨機(jī)數(shù)的對(duì)象,每次運(yùn)行時(shí)其結(jié)果都有可能不能。利用這個(gè)對(duì)象來對(duì)常量進(jìn)行初始化的時(shí)候,那么結(jié)果可能每次創(chuàng)建對(duì)象時(shí)這個(gè)結(jié)果都有可能不同。***這個(gè)常量只能夠做到在一個(gè)對(duì)象內(nèi)是恒定不變的,而無法做到在一個(gè)應(yīng)用程序內(nèi)是恒定不變的。另外一個(gè)方法就是將關(guān)鍵字static與關(guān)鍵字final同時(shí)使用。一個(gè)被定義為final的對(duì)象引用或者常量只能夠指向唯一的一個(gè)對(duì)象,不可以將他再指向其他對(duì)象。但是,正如上面舉的一個(gè)隨機(jī)數(shù)的例子,對(duì)象本身的內(nèi)容的值是可以改變的。為了做到一個(gè)常量在一個(gè)應(yīng)用程序內(nèi)真的不被更改,就需要將常量聲明為staitc final的常量。這是什么意思呢?正如上面筆者所說的,當(dāng)執(zhí)行一個(gè)應(yīng)用程序的時(shí)候,可以分為兩個(gè)步驟,分別為代碼裝載與對(duì)象創(chuàng)建。為了確保在所有情況下(即創(chuàng)建多個(gè)對(duì)象情況下)應(yīng)用程序還能夠得到一個(gè)相同值的常量,那么就***告訴編譯器,在代碼裝載的時(shí)候就初始化常量的值。然后在后續(xù)創(chuàng)建對(duì)象的時(shí)候,只引用這個(gè)常量對(duì)象的地址,而不對(duì)其再進(jìn)行再次初始化。就如同Private static final int int2=rd1.nestInt(10)這種形式來定義常量。如此,在后續(xù)多次創(chuàng)建對(duì)象后,這個(gè)常量int2的值都是相同的。因?yàn)樵趧?chuàng)建對(duì)象時(shí),其只是引用這個(gè)常量,而不會(huì)對(duì)這個(gè)常量再次進(jìn)行初始化。
由于加上這個(gè)static關(guān)鍵字之后,相當(dāng)于改變了Java常量定義的作用范圍。為此程序開發(fā)人員需要了解自己的需求,然后選擇是否需要使用這個(gè)關(guān)鍵字。在初始化常量的時(shí)候,如果采用函數(shù)(如系統(tǒng)當(dāng)前時(shí)間)或者對(duì)象(如生成隨機(jī)數(shù)的對(duì)象)來初始化常量,可以預(yù)見到在每次初始化這個(gè)常量時(shí)可能得到不同的值,就需要考慮是否要采用這個(gè)static關(guān)鍵字。一般情況下,如果只需要保證在對(duì)象內(nèi)部采用這個(gè)常量的話,那么這個(gè)關(guān)鍵字就可有可無的。但是反過來,如果需要在多個(gè)對(duì)象中引用這個(gè)常量,并且需要其值相同,那么就必須要采用static這個(gè)關(guān)鍵字了。以確保不同對(duì)象中都只有一個(gè)常量的值?;蛘哒f,不同對(duì)象中引用的常量其實(shí)指向的是內(nèi)存中的同一塊區(qū)域。
【編輯推薦】