26

I'm developing an Android application and I'm very new on Java and Android.

I want to create some constants to use in some activities. Where can I define these constants?

Thanks.

VansFannel
  • 45,055
  • 107
  • 359
  • 626

4 Answers4

52

It's considered bad practice in java, and most OO languages, to define a class simply to hold constants. It's much better to define the constants in a class they are associated with. Usually there is one. e.g.

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

If there really isn't one feel free to define a separate class.

EDIT:The key things here are:

  1. Make the constants easy to find. If there is a 'natural' place to put them, put them there (i.e. the default height for Component objects belong in the Component class).
  2. Don't have higher coupling than you need to. Putting all your constants in one 'Constants' class makes for high coupling, especially as subsequent modifiers tend to then put ALL constants in the Constants class, whether or not there is another class they could naturally be put in.
  3. Just because a constant is used by more than one class that doesn't mean it should be in a 'Constants' class. If a constant is used by 'Application' and classes that use the Application class then put it in the Application class. That way you are not increasing the coupling.
DJClayworth
  • 26,349
  • 9
  • 53
  • 79
  • interesting, I just read that variables and constants shouldn't be inside an interface for code readability. I agree with that, because I think good naming and a `Constants` class is much better, because most constants will be used in different classes. If you use constants to "configure" the app, its also good to have anything in one place – WarrenFaith Oct 05 '10 at 19:59
  • 3
    Variables can't be inside an interface. Constants should be, I believe, if they are relevant to all the classes implementing the interface. If your constants are used by ALL classes then yes, put them in a Constants class (as I said above). If they are used for configuring the application then maybe they belong in the Application class. They key thing is to make them easy to find, and not to have high coupling to any class. A Constants class tends to be very highly coupled if it isn't treated with care. – DJClayworth Oct 05 '10 at 20:41
  • If you have 10 constants at the top of your file, even if you use these constants in this file only, I don't see this as a clean code. I'd rather pay the price of "increasing the coupling" through an external constant file. – Guilherme Alencar Apr 12 '21 at 13:09
  • 1
    Everything in software development is a choice. However "increasing the coupling" has real consequences. Keeping the constants in the file allows you to make them private, and makes it clear that they are only used in that file, and that a future developer is free to change them. If they are in a separate file they need to be public, which increases the chance that another developer will use them, and now someone who wants to change the value in the original file has to do work to find out whether those changes will have an unexpected effect elsewhere. – DJClayworth Apr 12 '21 at 13:25
19

Normally, you'd use a Constants class, or define them in classes where they are used, a la:

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

Then you'd refer to them by:

String inst = Constants.SOME_TEXT;
billjamesdev
  • 14,554
  • 6
  • 53
  • 76
8

The most common way is to create 'constants' in the classes were you need them:

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

Instead of private it can also be declared default, protected or public. Although it is considered an OO anti pattern to define constants is a special 'constants' (God) class that stores constants for the whole application. Alternatively, you can also store configuration data in a Java properties file, this is not considered an anti-pattern.

Another option, that is rapidly gaining popularity, is the usage of the Dependency Inject (DI) pattern. Often this pattern is used for depend object, but it can also be used to inject constant values into objects. This can for example be implemented with Google's lightweight Guice DI framework:

class Example {
  String filename;

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

In a special Binder class you will bind a value to the Strings annotated with @ConfigFilename. This way, you have minimal coupling and classes that can be independently tested.

Nightfirecat
  • 11,432
  • 6
  • 35
  • 51
Kdeveloper
  • 13,679
  • 11
  • 41
  • 49
  • If I use a properties file on Android. Where may I put it? – VansFannel Oct 06 '10 at 06:09
  • There are several ways, for example reading the property file from the classpath (directory with classes): http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html – Kdeveloper Oct 06 '10 at 17:57
0

You can define some constants in Java enumerations.

A single Java enumerator may hold multiple fields of associated data.

Oracle provides this introduction to Java enumerations.

Andy Thomas
  • 84,978
  • 11
  • 107
  • 151
  • 5
    Accessing enumerators is quite slow operation, compared to local variables or "static final" (which as far as I know gets inline compiled by the java compiler). Also Enumerators have a quite high overhead, when it comes to memory/space usage. See http://developer.android.com/guide/practices/design/performance.html#avoid_enums – Tseng Oct 05 '10 at 19:23