簡體   English   中英

Java中的常量與屬性

[英]Constants vs properties in java

在我的Java程序中聲明常數值的最佳方法應該是什么?

是在.properties文件中聲明常量值還是在不同類中本質上將該值聲明為static final的最佳方法?

問題的答案取決於您要完成的工作。 但是其中也存在誤解。

屬性文件

屬性文件並不旨在替代常量或替代常量。 它們用於存儲可配置的值,例如ip,語言等。從文件加載常量會破壞常量的作用。

常數

另一點是,在Java中, public static final變量不是一個好方法,首選方式是使用枚舉器。(摘自Effective Java,第30條:使用枚舉代替int constatns )。 enum將迫使您以有意義的方式對常量進行分組,而充滿隨機public常量的類則難以管理。 Enum使您能夠提供功能,例如檢查,驗證,將該常量與多個對象相關聯,並且可以在switch語句中使用。 Enums也被編譯,這使它們更加有效和類型安全。 這本書更詳細地解釋了enums的好處。

我認為最好的方法是考慮該值是否會根據某些外部因素而改變,或者是否始終保持不變。

屬性文件和對配置的全局訪問

假設您的屬性文件中有一個ip,並且希望能夠從代碼中的任何位置訪問此值。 您可以讀取值並將其加載到公共靜態最終變量中。

如果執行此操作,將如何控制該值已初始化或配置的值正確? 在這種情況下,您可以使用單例類模式(只能存在該類的一個實例),該模式將加載文件並檢查值是否正確。

它可以將值存儲在private static final變量中,並啟用可以執行所需檢查以確保值正確的吸氣劑。 這使您可以全局訪問變量並將邏輯分組在一個位置。

下次向文件中添加值時,只需更新此類,而無需在代碼中查找位置以及檢查是否正確。

注意

許多人說做某事並不是真正的“最佳方法”。 我認為這是真的,但是如果您可以訪問Joshua Bloch的 Effetive Java之類 ,也應該閱讀它們並向已經從事編碼工作很長時間的人們學習。

如果這些值不是環境值(例如, dev,qa,stage特定且在代碼的整個生命周期中都不變),則將它們聲明為代碼中的static final。

常量的缺點是,如果對它們進行了一些更改,則需要重新編譯它們,這在屬性上不是這種情況,但是如果它是一個常量,則根本不應該更改。

例如:-在您的dev / qa / stage / prod環境中,用戶名“ admin”可能具有不同的憑據。

然后,您可以定義admin用戶,例如public static final String userId="admin"但是要從屬性文件中提供密碼,並根據運行代碼的環境對其進行更改。

喜歡

dev.properties admin.password = 123456。

qa.properties admin.password = abcdef。

然后根據您的環境從屬性文件中讀取這些密碼。

真正的答案取決於您的要求。 在現實世界中沒有“ A 勝過 B”。 僅:“給定要求x,y,z的A比B 更有用 ”。

因此,您只需考慮兩種方法的優缺點,即可確定對您而言“更好”的方法。

使用常量的優點:

  • 編譯時間安全
  • 首先支持編譯器
  • 簡單:只有一個常數。 屬性需要來自文件,它們都是扁平字符串,甚至可能會丟失

常量的缺點:

  • 一個錯誤修正需要您向客戶提供重新編譯的類文件
  • 為了應用該錯誤修復程序,需要停止運行您的代碼的JVM。 或者至少需要重新部署您的容器(例如Tomcat中的WAR)。

屬性只是“相反”。

換句話說:如果您願意,您可以編寫許多復雜的代碼,使您能夠通過重新讀取屬性信息來“修補”正在運行的應用程序。 這樣,您就可以通過提供新的屬性文件並觸發應用程序內部的“重新讀取屬性”鈎子來使客戶修補正在運行的應用程序。 但是請不要誤會: 很難實現正確,可靠的方法。

但是,除非上述功能對您具有真正的價值,否則您很可能最好使用純編譯時常量。 您會看到,“部署更新”是關於將文件提供給客戶。 這些文件中的大部分是類文件還是屬性文件(當我們不談論“修補程序”要求時)並不重要。

我嘗試了兩種方式-文件和公共靜態最終課程,並且都可以工作。 但是需要注意以下幾點:

  • 如果您的程序需要由希望更改這些常量的各方面進行測試/運行,則在文件中進行聲明特別有利。 在這種情況下,這些將被稱為應用程序/程序的屬性。 Spring遵循這種配置方法。
  • 在一個類中聲明它們將保證一次又一次地重建App,但是如果這些常量不變或不需要多方訪問,則可以很容易地選擇靜態的最終類方法。 以Android聲明在R.java文件中動態生成的常量為例。 順便說一下,這種方法將控制權掌握在您手中。 3rs各方使用您的代碼將無法更改這些常量。 文件方法將控制權移交給其他人以改變它們。

對象映射器還希望您在配置文件中具有Bean屬性,但是在Java Annotation中,這介於兩者之間,並且可以優雅地解決它。

第三種選擇:系統屬性。 可以在用於啟動程序的命令行中定義它們,也可以使用常量來簡化對它們的訪問並提供默認值。

例:

public static final String HOSTNAME = System.getProperty("my.host-name", "localhost");

但是,提供默認值並不總是一個好主意。

話雖如此,您選擇的方法將取決於問題的答案:是程序的值部分,還是程序安裝上下文的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM