Java
語(yǔ)言的最初設(shè)計(jì)者將“const”關(guān)鍵字作為保留字。但該術(shù)語(yǔ)仍未實(shí)現(xiàn),而且很可能永遠(yuǎn)不會(huì)實(shí)現(xiàn)。這種情況讓許多開發(fā)人員想知道為什么。想學(xué)習(xí)java技術(shù),建議考慮報(bào)名參加Java培訓(xùn),有明確的學(xué)習(xí)路線和全面系統(tǒng)的課程,能獲得較快提升。
讓我們更多地了解 Java 中的“const”關(guān)鍵字以及描述語(yǔ)言中常量的一些替代方法。
Java 中的“const”是什么意思?
任何看過(guò) Java
中的“const”關(guān)鍵字的人都會(huì)從邏輯上假設(shè)其最初的意圖是定義一個(gè)常量值。這個(gè)假設(shè)不會(huì)太離譜。
競(jìng)爭(zhēng)語(yǔ)言 C 和 C++ 都使用“const”關(guān)鍵字,但這些語(yǔ)言并非純粹面向?qū)ο?。?wèn)題就在這里。在 Java
中,作為“const”的東西到底意味著什么?
保持不變是否意味著實(shí)例變量不會(huì)改變?
保持不變是否意味著類變量不會(huì)改變?
常量是否意味著對(duì)象的方法不能被覆蓋?
保持不變是否意味著對(duì)象引用不會(huì)改變?
恒定是否意味著對(duì)象是不可變的?
考慮到上述所有問(wèn)題,另一個(gè)大問(wèn)題是如果一個(gè)對(duì)象僅在某些情況下是恒定的?
例如,某些語(yǔ)言允許“const”作為方法簽名的一部分,這表明對(duì)象及其屬性在方法內(nèi)使用的短時(shí)間內(nèi)不能更改。這有時(shí)被稱為常量正確性。語(yǔ)言架構(gòu)師在檢查這些任務(wù)并試圖確定“const”關(guān)鍵字的含義時(shí),最終可能會(huì)陷入一個(gè)深深的兔子洞。通過(guò)java培訓(xùn),你可以學(xué)習(xí)更多java知識(shí),以提高java技能。
Java 的“final”與“const”關(guān)鍵字
在 Java 中最初可能使用“const 關(guān)鍵字”解決的許多用例使用 Java 的“final”關(guān)鍵字已經(jīng)足夠解決了。在
Java 中,“final”用于:
將原始值標(biāo)記為常量;
表示方法不能被覆蓋;
指定對(duì)象引用不能更改;
確保變量在方法中不變。
當(dāng)“static”和“final”關(guān)鍵字組合時(shí),可以使類級(jí)變量保持不變。雖然這并沒有完全涵蓋在其他語(yǔ)言中使用“const”關(guān)鍵字的所有不同場(chǎng)景,但它已經(jīng)接近了。此外,將“靜態(tài)”和“最終”組合在一起的選擇為常量屬性的行為方式提供了更大的靈活性,而不是僅使用一個(gè)關(guān)鍵字來(lái)嘗試解決實(shí)例和類級(jí)別的語(yǔ)義。
當(dāng)開發(fā)人員考慮語(yǔ)言通過(guò)允許將“static”和“final”關(guān)鍵字菊花鏈在一起而提供的功能和靈活性時(shí),人們可能會(huì)推斷
Java 中未實(shí)現(xiàn)“const”關(guān)鍵字的原因是因?yàn)樗恍枰?。與 Java
中的“const”關(guān)鍵字的實(shí)現(xiàn)相比,“static”和“final”關(guān)鍵字的組合有效且可以說(shuō)提供了一種更具表現(xiàn)力的方式來(lái)聲明不變的變量。
不可變對(duì)象
就完全不可變的對(duì)象而言,歷史上的解決方法是將實(shí)例變量聲明為私有并通過(guò)公共 setter 和 getter
限制訪問(wèn)。最近,Java 引入了值類型的概念作為 JEP 169 的一部分。這將為該語(yǔ)言添加不可變、無(wú)引用的對(duì)象,并再次提供一種 Java
語(yǔ)言語(yǔ)法來(lái)實(shí)現(xiàn)許多與“const”相關(guān)的概念。在java培訓(xùn)中,也有很多關(guān)于java安全工具的學(xué)習(xí),理論知識(shí)+實(shí)踐項(xiàng)目,雙管齊下,學(xué)以致用,讓你深入淺出地學(xué)習(xí)java。
關(guān)于在 Java 中使用“const”關(guān)鍵字來(lái)實(shí)現(xiàn) const 正確性的討論始于 1999
年。但是,增強(qiáng)提案被拒絕為特性蠕變。語(yǔ)言架構(gòu)師斷言,在完全增量之后在 Java 中添加 const 實(shí)現(xiàn)——JDK
的長(zhǎng)期支持版本已經(jīng)推出——將導(dǎo)致代碼膨脹,并且可能存在向后兼容性問(wèn)題,從而完全扼殺了這個(gè)概念。從那以后,在 Java
中實(shí)現(xiàn)“const”關(guān)鍵字的想法就再也沒有被重新審視過(guò)。
Java 中的 const 關(guān)鍵字不能在不導(dǎo)致編譯時(shí)錯(cuò)誤的情況下使用。
為什么“const”沒有在 Java
中實(shí)現(xiàn)?如果沒有實(shí)現(xiàn)它的意圖,為什么要讓const成為保留字呢?
一個(gè)可能的原因是避免混淆。如果“const”不是保留字,則允許開發(fā)人員使用該短語(yǔ)來(lái)命名變量。試想一下,對(duì)于學(xué)習(xí)使用“const”實(shí)現(xiàn)的語(yǔ)言進(jìn)行編程的
C++ 和 Javascript 開發(fā)人員來(lái)說(shuō),這可能會(huì)造成多大的困惑。簡(jiǎn)單地將 Java
中的“const”關(guān)鍵字設(shè)為保留字有助于避免任何混淆。
為什么 Java 中的“const”是沒有實(shí)現(xiàn)的保留字?
同樣,這主要是為了避免混淆。其他關(guān)鍵字提供了等效的功能,并且因?yàn)樵摳拍畈贿m合面向?qū)ο蟮姆独??;蛘哂猛庑械脑拋?lái)說(shuō),Java
不需要它。
在大多數(shù)情況下,因?yàn)?JDK 不需要它,“const”在 Java
中沒有實(shí)現(xiàn)。其他語(yǔ)言特性提供聲明常量或提供不變性的能力。該語(yǔ)言的提供者希望避免混淆,并決定即使是善意的開發(fā)人員也不能在他們的代碼中使用該術(shù)語(yǔ)。很多人都會(huì)選擇報(bào)java培訓(xùn)班學(xué)習(xí),可以更快速學(xué)到有用的知識(shí)和技能,節(jié)省很多時(shí)間和精力。