2013-10-13 33 views
1

我正在從事項目工作,在那裏我被告知將所有字符串聲明爲常量並從那裏獲取。我想了解這背後的需要。聲明屬性名稱爲字符串常量是好方法嗎?

+1

取決於項目等。 – Maroun

+0

請在您的問題中提供更多詳情。問題的答案是主觀的,取決於你正在進行的項目類型。 –

+1

太模糊了,但如果這些字符串僅僅是文本字符串,並沒有被用作「邏輯」,那將是設置國際化的第一步。 – Frankie

回答

1

這是「沒有魔術常量」方針:不只是插入常量到代碼直接,因爲它們看起來像莫名其妙的「魔力」。如果您多次使用相同的常量,它也有助於避免輸入錯誤。

但是,如果常量的名稱是一樣的字符串(模數格式和空格),它缺少了這一點的內容,這是毫無意義,在我看來。

此外,如果字符串顯然是一個提示給用戶,它是而不是不明原因的魔術,所以這個準則是完全不適用的,不應該在這種情況下應用。

0

如果字符串常量是在多個地方使用,並且該程序的正確運行需要這個,最好是使用一個常數,例如

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 .. 

現在編譯器會強制只傳遞有效的常量。

對於非重用字符串常量,我不會理會,除非它是有道理的。不應盲目遵守教條式的規則。如果有意義,就去做吧。

+0

你介意在例子中選擇一個不同的名字嗎?我知道這僅僅是一個例子,但我們不希望人們認爲用'「one」'的值聲明一個名爲'ONE'的常量是個好主意。它違背了聲明常量的兩個目的:它不會使用法更清楚(「ONE」不能表達比「1」更多的含義),並且當您想要在全局範圍內更改該值時它不起作用或者以'public static final String ONE =「2」;'結尾,或者[你必須搜索每個出現的'ONE'並將其改爲'TWO'](http://thecodelesscode.com/case/9​​5 )) –

0

作爲一個經驗法則:如果你能想到可以形容不變(在上下文中的使用說明),比字面本身更好的名字 - 聲明一個全局常量。如果你不能 - 使用文字。

例如:如果您有System.out.println("Hello"),則很難爲字符串文字找到更好的名稱 - HELLOHELLO_STRINGTEXT_THAT_SAYS_HELLO?這些東西沒有增加太多價值,所以我們最好直接使用文字。但是,如果我們添加一些上下文 - 例如,"hello"是應用程序在向用戶顯示內容之前向用戶致意的一般方式 - 我們突然爲此常量命名爲 - GENERAL_GREETING。還要注意,給我們這個名字的同一個事實使得使用全局常量更有利 - 因爲它是所有地方常用的問候語,所以將其定義爲全局常量是有意義的,因此我們可以輕鬆地在應用程序中對其進行更改。

0
  • 它消除了多次使用相同的字符串文字散佈在整個項目中,因此需要大範圍的,通常很難找到的用法。
  • 它提供了相同的已知記錄變量,例如,而不必手動記錄爲常量FOO_BAR提供Javadoc的字符串「foo.bar」。
  • 它消除了某些類型的小錯誤,如拼寫錯誤輕微的。
  • 它驅動用戶可見字符串(例如提示和消息)的資源和/或配置文件的使用:在許多但並非全部的情況下,應該首選字符串常量。例如。,對於一個小小的項目,資源文件的開銷可能沒有意義–,你可能仍然需要常量來定義資源名稱。

無論是否有意義將全部字符串值都不可能在一般意義上回答。

0
  • 爲避免重複: 它是一個好主意,用常量當你有相同的知名度至少有兩個相同的值。例如在同一班級內。

  • 要編寫語義代碼: 它不一樣的

    int totalPrize = product.getPrize() * 1.21f; 
    

    比:

    int totalPrize = product.getPrize() * VAT; 
    
  • 爲了揭露值與其它clases:

    if(JOptionPane.YES_OPTION == response) 
    
+0

問題是關於* String *常量 – Bohemian

相關問題