我正在從事項目工作,在那裏我被告知將所有字符串聲明爲常量並從那裏獲取。我想了解這背後的需要。聲明屬性名稱爲字符串常量是好方法嗎?
回答
這是「沒有魔術常量」方針:不只是插入常量到代碼直接,因爲它們看起來像莫名其妙的「魔力」。如果您多次使用相同的常量,它也有助於避免輸入錯誤。
但是,如果常量的名稱是一樣的字符串(模數格式和空格),它缺少了這一點的內容,這是毫無意義,在我看來。
此外,如果字符串顯然是一個提示給用戶,它是而不是不明原因的魔術,所以這個準則是完全不適用的,不應該在這種情況下應用。
如果字符串常量是在多個地方使用,並且該程序的正確運行需要這個,最好是使用一個常數,例如
public static final String ONE = "apple";
// client usage
doSomething(ONE);
// service usage
void doSomething(String action) {
if (action.equals(ONE)) {
// whatever
else ...
}
沒有一個恆定的,你會得到「Stringly類型化」的代碼,因爲你可以繞過垃圾和代碼編譯:
doSomething("foo"); // compiles, but won't function correctly
然而,使用字符串作爲有意義的常數仍然是‘寬鬆’的代碼。最好使用一個枚舉:
enum Action {
ONE, TWO, THREE
}
void doSomething(Action action) {
if (action == ONE) {
// whatever
else ..
現在編譯器會強制只傳遞有效的常量。
對於非重用字符串常量,我不會理會,除非它是有道理的。不應盲目遵守教條式的規則。如果有意義,就去做吧。
你介意在例子中選擇一個不同的名字嗎?我知道這僅僅是一個例子,但我們不希望人們認爲用'「one」'的值聲明一個名爲'ONE'的常量是個好主意。它違背了聲明常量的兩個目的:它不會使用法更清楚(「ONE」不能表達比「1」更多的含義),並且當您想要在全局範圍內更改該值時它不起作用或者以'public static final String ONE =「2」;'結尾,或者[你必須搜索每個出現的'ONE'並將其改爲'TWO'](http://thecodelesscode.com/case/95 )) –
作爲一個經驗法則:如果你能想到可以形容不變(在上下文中的使用說明),比字面本身更好的名字 - 聲明一個全局常量。如果你不能 - 使用文字。
例如:如果您有System.out.println("Hello")
,則很難爲字符串文字找到更好的名稱 - HELLO
? HELLO_STRING
? TEXT_THAT_SAYS_HELLO
?這些東西沒有增加太多價值,所以我們最好直接使用文字。但是,如果我們添加一些上下文 - 例如,"hello"
是應用程序在向用戶顯示內容之前向用戶致意的一般方式 - 我們突然爲此常量命名爲 - GENERAL_GREETING
。還要注意,給我們這個名字的同一個事實使得使用全局常量更有利 - 因爲它是所有地方常用的問候語,所以將其定義爲全局常量是有意義的,因此我們可以輕鬆地在應用程序中對其進行更改。
- 它消除了多次使用相同的字符串文字散佈在整個項目中,因此需要大範圍的,通常很難找到的用法。
- 它提供了相同的已知記錄變量,例如,而不必手動記錄爲常量FOO_BAR提供Javadoc的字符串「foo.bar」。
- 它消除了某些類型的小錯誤,如拼寫錯誤輕微的。
- 它驅動用戶可見字符串(例如提示和消息)的資源和/或配置文件的使用:在許多但並非全部的情況下,應該首選字符串常量。例如。,對於一個小小的項目,資源文件的開銷可能沒有意義–,你可能仍然需要常量來定義資源名稱。
無論是否有意義將全部字符串值都不可能在一般意義上回答。
爲避免重複: 它是一個好主意,用常量當你有相同的知名度至少有兩個相同的值。例如在同一班級內。
要編寫語義代碼: 它不一樣的
int totalPrize = product.getPrize() * 1.21f;
比:
int totalPrize = product.getPrize() * VAT;
爲了揭露值與其它clases:
if(JOptionPane.YES_OPTION == response)
問題是關於* String *常量 – Bohemian
- 1. 聲明字符串常量
- 2. JavaScript對象聲明語法 - 作爲屬性的變量名稱
- 3. 空字符串是合法的字段/方法名稱嗎?
- 4. 對象::屬性(常量字符*名稱)常量返回空QVariant
- 5. 常量字符串的格式聲明
- 6. Android:有沒有獲得字符串屬性名稱的方法?
- 7. 如何將早期綁定的屬性名稱作爲字符串常量?
- 8. 聲明一個字符串名稱的新變量
- 9. *聲明字符串時,*名稱和名稱中的不同*
- 10. 解析不使用字符串屬性名稱的javascript對象聲明
- 11. 將屬性聲明爲受保護的更好的方法
- 12. 無法聲明字符串變量
- 13. 獲取字符串的常量名稱
- 14. 將變量聲明爲'var'是一種好的做法嗎?
- 15. 「maxPwdAge」是LDAP的常量屬性名稱嗎?
- 16. 不明白常量方法聲明
- 17. 使用內置函數名稱作爲屬性或方法標識符是不好的做法嗎?
- 18. 打字稿:變量的聲明/屬性中的類/方法
- 19. C# - 這個聲明的字符串被視爲一個常量?
- 20. 沒有名稱屬性的字符串值:字符串
- 21. 在公共常量字符串中存儲私有名稱是一種很好的做法嗎?
- 22. PHP實例屬性名字符串作爲方法參數
- 23. 在聲明的屬性中獲取屬性名稱
- 24. 獲取行爲名稱作爲屬性參數的字符串
- 25. Python:將變量或變量的屬性的名稱轉換爲字符串
- 26. 使用字符串變量按名稱查找屬性
- 27. 如何根據字符串變量切換屬性名稱?
- 28. JSON指定帶字符串變量的JObject屬性名稱
- 29. 爲什麼.NET模式驗證聲稱名稱空間lang屬性未聲明?
- 30. 在JavaScript對象中聲明不屬於字符串的屬性
取決於項目等。 – Maroun
請在您的問題中提供更多詳情。問題的答案是主觀的,取決於你正在進行的項目類型。 –
太模糊了,但如果這些字符串僅僅是文本字符串,並沒有被用作「邏輯」,那將是設置國際化的第一步。 – Frankie