2010-10-05 50 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