Java編譯期常量解釋及其使用風險

2021-09-12 11:05:55 字數 726 閱讀 3764

定義上來說,宣告為final型別的基本型別或string型別並直接賦值(非運算)的變數就是編譯期常量,即:

final int i = 4;

final string str = "dasd";

// 非編譯期常量

final string str1 = new string("dasd");

注意點:由於編譯期常量在編譯時就確定了值,使用編譯期常量的地方在編譯時就會替換成對應的值

實際上我們一般將編譯期常量宣告為public static final型別(靜態常量),在這種情況下,引用編譯期常量不會導致類的初始化才是正確的。本來引用static變數會引起類載入器載入常量所在類,並進行初始化,但由於是編譯期常量,編譯器在編譯引用這個常量的類時,會直接將常量替換為對應值,也就無需再去載入常量所在的類了。

因此,也就必須指出編譯期常量的使用風險:a類定義了乙個編譯期常量,b類中使用了這個常量,兩者都進行了編譯。然後修改了a中常量的值,重新進行編譯時,系統只會重新編譯改動的a類,而舊**b沒有重新編譯。導致了b中常量值與a中常量值的不一致。

對應到實際業務中,可能是我們的程式中使用了乙個第三方庫中公有的編譯期常量時,如果對方更新了該常量的值,而我們隨後也只更新依賴的jar包,那麼我們的程式中該常量就是老值,就會產生隱患。為了避免這種情況,在更新依賴的jar檔案時,應該重新編譯我們的程式。

Java列舉特殊類及其靜態常量例項

1.作用 為什麼要有列舉?問題 要定義星期幾或性別的變數,該怎麼定義?假設用1 7分別表示星期一到星期日,但有人可能會寫成int weekday 0 或即使使用常量方式也無法阻止意外.列舉就是要讓某個型別的變數的取值只能為若干個固定值中的乙個,否則,編譯器就會報錯 列舉可以讓編譯器在編譯時就可以控制...

Java中的Map及其使用

概述 將鍵對映到值的物件 乙個對映不能包含重複的鍵 每個鍵最多只能對映到乙個值 map介面和collection介面的不同 map是雙列的,collection是單列的 map的鍵唯一,collection的子體系set是唯一的 map集合的資料結構針對鍵有效,跟值無關 collection集合的資...

Linux常用基礎命令及其解釋使用範圍

linux運維最常用命令彙總 線上查詢及幫助命令 man 檢視命令幫助,命令的詞典,更複雜的還有info,但不常用。man手冊 help 檢視linux內建命令的幫助,比如cd命令。檔案和目錄操作命令 ls 全拼list,功能是列出目錄的內容及其內容屬性資訊。cd 全拼change director...