2010-10-05 56 views
19

我正在開發一個Android應用程序,我對Java和Android非常感興趣。Java常量文件

我想創建一些常量用於某些活動。我可以在哪裏定義這些常量?

謝謝。

回答

45

它被認爲在Java中不好的做法,大多數面嚮對象語言,簡單地定義一個類來保存常量。定義它們關聯的類中的常量要好得多。通常有一個。例如

interface MyComponent { 
    /** The default height for a component */ 
    public static final int DEFAULT_HEIGHT = 5; 
    // other stuff 
} 

如果真的沒有人可以自由地定義一個單獨的類。

編輯:這裏的關鍵事情是:

  1. 讓常量容易找到。如果有「自然」放置它們的地方,將它們放在那裏(即Component對象的默認高度屬於Component類)。
  2. 不要有比你需要更高的耦合。將所有常量放在一個'常量'類中可以實現高耦合,特別是隨後的修飾符傾向於將所有常量放入常量類中,而不管是否有另一個類可以自然放入。
  3. 僅因爲常量被多個類使用,並不意味着它應該在'常量'類中。如果「應用程序」和使用應用程序類的類使用常量,則將其放入應用程序類中。這樣你就不會增加耦合。
+0

有趣的是,我剛剛讀到變量和常量不應該在代碼可讀性的界面內。我同意這一點,因爲我認爲好的命名和'Constants'類更好,因爲大多數常量將用於不同的類。如果您使用常量來「配置」應用程序,那麼也可以在一個地方使用任何東西 – WarrenFaith 2010-10-05 19:59:19

+3

變量不能位於界面中。我相信,如果它們與實現接口的所有類相關,常量應該是。如果你的常量被所有的類使用,那麼是的,把它們放在一個常量類中(如上所述)。如果它們用於配置應用程序,那麼它們可能屬於Application類。他們關鍵的問題是讓他們很容易找到,而不是與任何階層有很高的聯繫。如果不小心處理,Constants類往往會非常耦合。 – DJClayworth 2010-10-05 20:41:14

18

通常情況下,你會使用一個常量類,或者在它們用於類定義它們,一拉:

class Constants { 
    public static final int NUM_TRIANGLES = 4; 
    public static final String SOME_TEXT = "This is a constant"; 
} 

然後,你指的他們是:

String inst = Constants.SOME_TEXT; 
+8

我知道你剛纔展示的例子,但我想強調一個不應該使用CONST_作爲常量的前綴。 ALL_CAPS是指示常量的標準方式。 – 2010-10-05 17:41:46

+0

你也可以把它變成一個接口而不是一個類。 – 2010-10-05 17:42:22

+0

對,這只是一個例子,如果他來自C/C++(這是我的問題),可能讓人想起提問者的背景。 – billjamesdev 2010-10-05 17:44:02

0

您可以在Java枚舉中定義一些常量。

單個Java枚舉器可能包含多個關聯數據字段。

Oracle提供this introduction to Java enumerations.

+5

訪問枚舉是相當慢的操作,與局部變量或「靜態最終」(據我所知是由java編譯器內聯編譯)相比。當涉及內存/空間使用情況時,枚舉器的開銷也相當高。請參閱http://developer.android.com/guide/practices/design/performance.html#avoid_enums – Tseng 2010-10-05 19:23:18

7

最常用的方法是在類創建「constants」是你需要他們:

class Example { 
    private static final int FILENAME = "test.txt; 
} 

而不是私人也可以宣佈default,保護或公開。儘管定義常量被認爲是OO anti pattern是一個特殊的「常量」(God)類,它存儲了整個應用程序的常量。或者,您也可以將配置數據存儲在Java properties file中,這不被視爲反模式。

另一種快速普及的選擇是使用Dependency Inject(DI)模式。這個模式通常用於依賴對象,但它也可以用於將常量值注入到對象中。例如,這可以與谷歌的輕量級Guice DI框架來實現:

class Example { 
    String filename; 

    @Inject 
    public Example(@ConfigFilename String filename) { 
    this.filename = filename;   
    } 

在一個特殊的Binder類,你會綁定一個值與@ConfigFilename註釋的字符串。這樣,您可以進行獨立測試的最小耦合和類。

+0

如果我在Android上使用屬性文件。我可以放在哪裏? – VansFannel 2010-10-06 06:09:17

+0

有幾種方法,例如從類路徑(具有類的目錄)中讀取屬性文件:http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html – Kdeveloper 2010-10-06 17:57:16

+0

Dagger也很酷https://github.com/square/dagger – Caipivara 2015-01-27 16:29:59