[英]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 更有用 ”。
因此,您只需考慮兩種方法的優缺點,即可確定對您而言“更好”的方法。
屬性只是“相反”。
換句話說:如果您願意,您可以編寫許多復雜的代碼,使您能夠通過重新讀取屬性信息來“修補”正在運行的應用程序。 這樣,您就可以通過提供新的屬性文件並觸發應用程序內部的“重新讀取屬性”鈎子來使客戶修補正在運行的應用程序。 但是請不要誤會: 很難實現正確,可靠的方法。
但是,除非上述功能對您具有真正的價值,否則您很可能最好使用純編譯時常量。 您會看到,“部署更新”是關於將文件提供給客戶。 這些文件中的大部分是類文件還是屬性文件(當我們不談論“修補程序”要求時)並不重要。
我嘗試了兩種方式-文件和公共靜態最終課程,並且都可以工作。 但是需要注意以下幾點:
對象映射器還希望您在配置文件中具有Bean屬性,但是在Java Annotation中,這介於兩者之間,並且可以優雅地解決它。
第三種選擇:系統屬性。 可以在用於啟動程序的命令行中定義它們,也可以使用常量來簡化對它們的訪問並提供默認值。
例:
public static final String HOSTNAME = System.getProperty("my.host-name", "localhost");
但是,提供默認值並不總是一個好主意。
話雖如此,您選擇的方法將取決於問題的答案:是程序的值部分,還是程序安裝上下文的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.