Java 介面是儲存常量的最佳位置嗎?

Mondo 旅遊 更新 2024-01-31

j**a 介面作為儲存常量的最佳位置的問題。

由於在 j**a 介面中宣告的字段在編譯時會自動新增靜態 final 修飾符,因此它們被宣告為常量。 因此,介面通常是儲存常量的最佳位置。 但是,當涉及到j**a的實際應用時,存在一些問題。

這個問題有兩個原因,首先是我們使用的常量不是靜態的,而是相對於變數不能改變的。 例如,我們在專案開始時定義常數 314,雖然由於計算準確性的提高,我們可能會重新定義 314159,此時應更改整個專案對此常量的引用。 其次,j**a 是一種動態語言。 與 C++ 等靜態語言不同,j**a 對某些欄位的引用可以在執行時動態進行,這種靈活性是 j**a 等動態語言的一大優勢。 因此,有時我們在更改 J**a 專案中的某些部分內容時不需要重新編譯整個專案,而只需要編譯更改的部分並重新發布即可更改整個應用程式。

說了這麼多,你還不知道我要說什麼?好的,讓我們看乙個簡單的例子:

有乙個介面 a,乙個類 b,如下所示:

//file a.j**apublic interface a//file b.j**apublic class b}
很簡單,好吧,編譯乙個J**a 和 Bj**a。

執行,輸入 j**a b,顯然結果如下:

class a's name = bright
我們現在將修改乙個J**A 如下:

//file a.j**apublic interface a
編譯乙個j**a,重新執行b類,輸入j**a b,注意:結果如下。

class a's name = bright
為什麼不是“A類的名字=光明的大海”?我們使用 JDK 提供的反編譯工具 j**ap 來反編譯 B類檢視它是什麼,鍵入:j**ap -c b,結果如下:

compiled from b.j**apublic class b extends j**a.lang.object method b()0 aload_01 invokespecial #1 4 returnmethod void main(j**a.lang.string)0 getstatic #2 3 ldc #3 5 invokevirtual #4 8 return
注意到標籤 3 的 ** 了嗎?通過引用靜態 final 字段,編譯器已將介面 A 中名稱的內容編譯為類 B,而不是對介面 A 中名稱的引用。 因此,除非我們重新編譯 B 類,否則介面 A 中 Name 的更改不會反映在 B 類中。 如果你這樣做,那麼 J**A 的動態優勢就消失了。

解決方案,有兩種解決方法。

第一種方法是停止使用常量,將必填字段放入類宣告中,並刪除 final 修飾符。 但是,該方法不再是常量存在一定的風險,因此在系統執行時可能會被其他類修改並出現錯誤,這與將其設定為常量的初衷相悖,因此不推薦使用。

第二種方法是將乙個常量放入類宣告中,並使用類方法獲取該常量的值。 為了保持對這個常量的引用簡單,我們可以使用靜態方法。 我們將J**a 和 Bj**a 修改如下:

//file a.j**apublic class a}//file b.j**apublic class b}
同樣,我們編譯乙個J**a 和 Bj**a。執行類 b,鍵入 j**a b,顯然結果是這樣的:

class a’s name = bright

現在讓我們修改乙個J**A 如下:

//file a.j**apublic class a}
讓我們再編譯乙個j**a,重新執行b類,輸入j**a b:結果如下。

class a's name = bright sea
終於得到了我們想要的結果,我們可以再次反編譯 b類 要檢視 B 類更改了什麼,請鍵入:

j**ap -c b,結果如下:

compiled from b.j**apublic class b extends j**a.lang.object method b()0 aload_01 invokespecial #1 4 returnmethod void main(j**a.lang.string)0 getstatic #2 3 new #3 6 dup7 invokespecial #4 10 ldc #5 12 invokevirtual #6 15 invokestatic #7 18 invokevirtual #6 21 invokevirtual #8 24 invokevirtual #9 27 return
注意 10-15 行標記的 **,類 b 已經成為類 a 的 getname() 方法的引用,當常量名稱的值發生變化時,我們只需要修改並重新編譯類 a 中的常量,我們就可以將整個應用程式對這個常量的引用更改,而無需編譯整個專案專案, 既保持了J**A的動態優勢,又保持了使用常量的初衷,所以方法2是最佳解。

相關問題答案

    什麼是復位按鈕?它是一種復位鍵,常見於各種電子裝置中

    在智慧型裝置中,經常可以看到復位復位鍵,以下是相關解讀 .定義復位鍵,或稱復位鍵,常見於各種電子裝置上,其主要功能是將裝置恢復到初始狀態。.特徵 當裝置出現故障 崩潰無響應或需要恢復到初始設定時,重置鍵可能會發揮作用。按下此鍵時,裝置將重新啟動並擦除所有當前設定和資料 載入預設配置或執行系統自檢等操...

    經常吃“豬油”的人對心腦血管疾病是好是壞?現在告訴你答案

    經常吃 豬油 的人對心腦血管疾病是好是壞?現在告訴你答案 一 引言 豬油作為傳統的食用油之一,因其獨特的口感和香氣而受到人們的喜愛。然而,近年來,關於豬油對心腦血管健康的影響一直存在爭議。經常吃豬油的人,對心腦血管是好是壞?本文將為您解開這個謎團,並告訴您答案。二 豬油的營養成分 豬油中含有豐富的飽...

    我以為是凍瘡,結果卻是“紅斑狼瘡”!這種疾病通常是偽裝的,所以不要成為目標

    知名演員周海美去世的訊息,讓不少感到悲痛。而她的死因,根據周海妹的工作室微博,就是因為生病。此前,周海美的朋友 香港演員田啟文在接受 採訪時表示,周海美 長期飽受紅斑狼瘡困擾 因此,紅斑狼瘡的相關條目立即衝上熱搜,引發廣泛討論。看著衝上熱搜的紅斑狼瘡,小康美兒又想和大家聊聊這個病。系統性紅斑狼瘡。它...

    過完年,孩子有嚴重的糧食堆積,“真兇”在家裡很常見,你還在給孩子吃嗎?

    過年最開心的就是孩子們,過年前後的這段時間,飲食非常豐富,畢竟一年只有一次,一定要吃得更好。然而,到了節日很多孩子因為 吃 而出現一些問題。最典型的就是食物的積累。而造成食物堆積的 真兇 竟然在家庭中屢見不鮮,下面三位家長都要小心!.大魚大肉 為了讓她多吃點,家裡每天熬湯 魚湯 骨湯 肉湯,倒在湯飯...

    燕麥是“有害小麥”,還是有營養?提醒:經常吃這3種食物可能對健康有害

    今年歲的老吳,沒想到剛退休就得了糖尿病。我老婆吳阿姨聽說糖尿病危害極大,飲食要格外小心,於是上網找了各種降糖食物。她看到一篇文章說糖尿病患者可以多吃燕麥等全穀物,而不是公尺飯 麵條和饅頭作為主食,可以幫助控制血糖。於是她立刻去超市買了幾包即食燕麥片,每天送給老吳。沒想到,吃了一會兒,老吳去醫院查了一...