Hi, today we will learn the topic of the Java Constants. You can study the material either in video format with a CodeGym mentor or in a more detailed text version with me below.

Ever been debugging at 3 AM and discovered some mysterious number like 86400 scattered throughout the codebase, with zero context about what it represents? Ugh, been there. For future reference, that's seconds in a day... but wouldn't it be nice if the original developer had made that clear?

This is exactly why Java constants exist, and why they've saved my sanity more times than I can count. During my years teaching folks transitioning into programming, constants are one of those "aha moment" concepts that make clean code click.

Let's dive into everything you should know about Java constants - no fluff, just practical stuff that'll make your code better.

What is a Java Constant?

My pal Sarah, who was switching careers into tech, once hit me with: "Why can't I just use regular variables for everything?" Fair question! A Java constant is basically a variable that's locked in—you set it once, and it doesn't budge. Regular variables? They're like flip-flops, changing whenever you want. Constants? They're the stubborn friend who won't move from their spot all night.

Java constants rely on two keywords: static and final. Together they create values that:

  1. Can't be modified (final)
  2. Belong to the class rather than specific instances (static)

I learned the importance of constants the hard way. Years ago, I worked on a project where someone accidentally changed a tax rate variable that was supposed to stay fixed at 7.25%. We sent out hundreds of invoices with incorrect tax calculations before catching it. Nightmare.

How to Declare a Constant in Java

There are several ways to create constants in Java. Each has its place, so let's look at the practical options.

Using public static final

This is the bread-and-butter approach you'll use most:

Java
public class AppConfig {
    // Some database connection goodies
    public static final int DB_TIMEOUT_SECONDS = 30;
    public static final String DB_URL = "jdbc:mysql://localhost:3306/myapp";
    public static final boolean ENABLE_QUERY_LOGGING = false;
}

Using these constants elsewhere is straightforward:

Java
int timeout = AppConfig.DB_TIMEOUT_SECONDS;
// Database connection code...

Using Enums

For related constants, enums are usually better. They came with Java 5, and they're awesome:

Java
public enum DayOfWeek {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

You can also create more complex enums with properties and methods:

Java
public enum PaymentType {
    CREDIT_CARD(true, "Credit Card Payment"),
    PAYPAL(true, "PayPal Payment"),
    BANK_TRANSFER(false, "Bank Transfer"),
    CASH(false, "Cash Payment");
    
    private final boolean isDigital;
    private final String displayName;
    
    PaymentType(boolean isDigital, String displayName) {
        this.isDigital = isDigital;
        this.displayName = displayName;
    }
    
    public boolean isDigital() {
        return isDigital;
    }
    
    public String getDisplayName() {
        return displayName;
    }
}

Using enum constants is type-safe and clear:

Java
if (payment.getType() == PaymentType.CREDIT_CARD) {
    // Process credit card payment
}

Interface Constants (The Old Way)

You might see this in older codebases:

Java
public interface DatabaseConstants {
    int TIMEOUT_SECONDS = 30; // Sneaky—it's public static final under the hood
    String URL = "jdbc:mysql://localhost:3306/myapp";
}

Heads-up, though: most Java pros call this a no-no now. I once took over a project drowning in these "constant interfaces," and figuring out where anything came from was a total headache.

Constant Naming

No matter which approach you pick, Java constants should use ALL_CAPS_WITH_UNDERSCORES. This makes them instantly recognizable:

Java
// Good
public static final int MAX_USERS = 1000;

// Bad - looks like a regular variable
public static final int maxUsers = 1000;

Static Final vs Enums: Which Should You Use?

When I taught my buddy Alex Java, he asked: "Why use enums when static final seems easier?" Great question! Here's my real-world breakdown:

When to Use static final:

  • For standalone values that aren't part of a group
  • When you just need a simple primitive or String
  • For configuration values or mathematical constants

My favorite example is in a PDF generation library I worked on:

Java
public class PdfConstants {
    public static final float DEFAULT_MARGIN_INCHES = 0.75f;
    public static final String DEFAULT_FONT = "Helvetica";
    public static final int DEFAULT_FONT_SIZE = 12;
}

When to Use Enums:

  • For related constants that form a set (days, statuses, types)
  • When you need type safety
  • When constants need additional properties or behavior

Back when I built a task management system, we used this enum:

Java
public enum TaskStatus {
    NEW, IN_PROGRESS, ON_HOLD, COMPLETED, CANCELLED;
    
    public boolean isActive() {
        return this == NEW || this == IN_PROGRESS || this == ON_HOLD;
    }
    
    public boolean isTerminal() {
        return this == COMPLETED || this == CANCELLED;
    }
}

This made status checks clear and error-proof:

Java
if (task.getStatus().isActive()) {
    // Show edit button
}

Using raw strings instead would've been error-prone:

Java
// Bad approach
if (task.getStatus().equals("IN_PROGRESS") || 
    task.getStatus().equals("NEW") || 
    task.getStatus().equals("ON_HOLD")) {
    // Typos waiting to happen!
}

I've seen so many bugs from typos in status checks - enums eliminate that entire class of problems.

Best Practices for Java Constants

After years of coding and helping others, here's my shortlist of must-dos:

1. Don't Create a Giant Constants Class

I once inherited a project with a Constants.java file stretching 1,500 lines—database timeouts, UI colors, you name it. It was like digging through a messy closet. Now, I keep constants near where they're used. If a few classes need the same ones, I make a small, focused class just for that group.

Bad:

Java
// Avoid this monster
public class Constants {
    // Hundreds of unrelated constants...
}

Better:

Java
public class SecurityConstants {
    public static final int PASSWORD_MIN_LENGTH = 8;
    public static final int MAX_LOGIN_ATTEMPTS = 5;
    // Other security-related constants
}

public class UiConstants {
    public static final String PRIMARY_COLOR = "#336699";
    public static final int DEFAULT_PADDING = 16;
    // Other UI-related constants
}

2. Be Careful With Mutable Objects as Constants

This is a sneaky one! Making a reference final doesn't make the object itself immutable:

Java
// Dangerous!
public static final List ADMIN_ROLES = new ArrayList<>();
static {
    ADMIN_ROLES.add("SUPER_ADMIN");
    ADMIN_ROLES.add("SYSTEM_ADMIN");
}

// Later someone can do this:
SecurityConstants.ADMIN_ROLES.clear(); // Oops!

Instead, use unmodifiable collections:

Java
// Better - Java 9+
public static final List ADMIN_ROLES = 
    List.of("SUPER_ADMIN", "SYSTEM_ADMIN");

// Or for pre-Java 9:
public static final List ADMIN_ROLES = 
    Collections.unmodifiableList(Arrays.asList("SUPER_ADMIN", "SYSTEM_ADMIN"));

I lost two days once chasing a bug where a list of file extensions got trashed by one part of the app, breaking uploads elsewhere. Unmodifiable lists would've saved me.

3. Document Magic Numbers

For numbers that aren't obvious, toss in a comment:

Java
// Milliseconds in a day (24 * 60 * 60 * 1000)
public static final long DAY_IN_MS = 86_400_000;

// Maximum file size in bytes (10MB)
public static final int MAX_FILE_SIZE = 10_485_760;

My team's thanked me for this—it cuts out all those "wait, what's this?" chats.

Real-World Examples of Java Constants

Constants might seem basic, but they're everywhere in professional code:

Configuration Constants

Java
public class AppConfig {
    public static final int CONNECTION_TIMEOUT_MS = 30000;
    public static final int MAX_POOL_SIZE = 100;
    public static final String API_BASE_URL = "https://api.example.com/v2";
}

Status and State Enums

Java
public enum OrderStatus {
    PENDING, PAID, SHIPPED, DELIVERED, CANCELLED;
    
    public boolean allowsModification() {
        return this == PENDING || this == PAID;
    }
}

A client's e-commerce system used an enum like this for order processing. The allowsModification() method prevented customer service reps from modifying orders that had already shipped - clean and foolproof.

Framework Constants

Spring Framework uses constants extensively:

Java
// In Spring Framework's HttpStatus class
public static final int OK_VALUE = 200;
public static final int NOT_FOUND_VALUE = 404;

Common Pitfalls with Java Constants

Even experienced devs sometimes get tripped up by these issues:

Trying to Change a final Variable

Java
public static final double TAX_RATE = 0.07;

public void updateTaxRate() {
    TAX_RATE = 0.08; // Compiler error!
}

This is an obvious one, but I still see beginners try it. If a value needs to change, it shouldn't be a constant.

Forgetting That final Only Applies to References

As mentioned earlier, making an object reference final doesn't make the object immutable:

Java
public static final Date SERVICE_START_DATE = new Date();

// Later:
SERVICE_START_DATE.setTime(0L); // This works! The date is changed.

The solution is to use immutable types when possible, or wrap mutable objects with unmodifiable views.

Constant Shadowing

This one's subtle but maddening:

Java
public class Parent {
    public static final int MAX_SIZE = 100;
}

public class Child extends Parent {
    // Oops - hiding the parent constant
    public static final int MAX_SIZE = 200;
}

Now you've got two constants with the same name, and which one you get depends on the reference type. This has caused hours of debugging for my students.

Conclusion

Constants might not sound sexy, but they're the quiet heroes of solid code. They keep your values straight and your code easy to follow. Next time you're itching to hardcode a number, think twice—constants have your back. And if you're ever stuck debugging at 3 AM, at least you won't be puzzling over what 86400 is.

Key takeaways:

  • Use UPPER_CASE_WITH_UNDERSCORES for constant names
  • Prefer enums for related constants
  • Keep constants close to where they're used
  • Be careful with mutable objects as constants
  • Document non-obvious numeric constants

My old coding mentor used to say, "Constants hold the line against chaos." After years in the trenches, I'm nodding along.

Want to up your Java game? Check out CodeGym's interactive courses—tons of hands-on tasks with instant feedback. If you're aiming past junior gigs, their Java University program's 12-month mentorship could fast-track you there.