Skip to main content

How to Create Immutable Class and Object in Java

How to create Immutable Class and Object in Java - Tutorial Example

Writing or creating immutable classes in Java is becoming popular day by day, because of the concurrency and multithreading advantages provided by immutable objects. Immutable objects offer several benefits over a conventional mutable object, especially while creating concurrent Java applications. An immutable object not only guarantees the safe publication of an object’s state but also can be shared among other threads without any external synchronization. In fact, JDK itself contains several immutable classes like String, Integer, and other wrapper classes.

For those who don’t know, immutable objects are those whose state cannot be changed once created. A good example is java.lang.String — once created, a String object cannot be modified. Any operation that seems to modify a String object (like trim(), toUpperCase(), etc.) actually results in a new object.
What is an immutable class in Java? Example

What is an Immutable Class in Java?

An immutable class is one whose object cannot be modified once created. Any modification will result in a new immutable object. The best examples to understand this concept are String (immutable) and StringBuffer (mutable). Here are some important characteristics of immutable classes:

  • The state of an immutable object cannot be modified after construction.
  • All fields of the immutable class should be final.
  • Object references must not leak during the construction process.
  • The class should be declared final to prevent inheritance.

    Builder design pattern explained

How to Write an Immutable Class in Java?

Below are the key rules to create an immutable class in Java:

  1. The state of the object cannot be modified after construction.
  2. All fields should be final to ensure they are assigned only once.
  3. Ensure proper construction to prevent object reference leaks.
  4. Declare the class final to avoid subclassing, which could break immutability.

Let's look at a simple example of creating an immutable class:

Example of Immutable Class

public final class Contacts {

  private final String name;
  private final String mobile;

  public Contacts(String name, String mobile) {
    this.name = name;
    this.mobile = mobile;
  }

  public String getName() {
    return name;
  }

  public String getMobile() {
    return mobile;
  }
}

In this example, the Contacts class is immutable because its state cannot be changed after the object is created. Both the fields (name and mobile) are final and assigned only once inside the constructor.

Handling Mutable Fields

Sometimes, you may need to include mutable fields (like Date) in an immutable class. In such cases, returning a copy of the mutable object is recommended to preserve immutability.

public final class ImmutableReminder {
  private final Date remindingDate;

  public ImmutableReminder(Date remindingDate) {
    if (remindingDate.getTime() < System.currentTimeMillis()) {
      throw new IllegalArgumentException("Cannot set a reminder for past time: " + remindingDate);
    }
    this.remindingDate = new Date(remindingDate.getTime());
  }

  public Date getRemindingDate() {
    return new Date(remindingDate.getTime());
  }
}

In this example, Date is a mutable object, but we preserve immutability by returning a clone of the Date object instead of returning the actual reference.

Benefits of Immutable Classes in Java

  • Immutable objects are inherently thread-safe and can be shared without synchronization in a concurrent environment.
  • They simplify development by removing the need for synchronization.
  • Immutable objects can be reused and cached for better performance.
  • They play a key role in writing functional programming code in Java.

However, immutability also has some downsides, like creating additional garbage due to the need for new objects whenever modifications are required.

Conclusion

In this article, we explored how to create immutable classes in Java, discussed their properties, and examined the benefits and challenges of using immutable objects. If you're working on concurrent applications, leveraging immutability can greatly simplify your code while improving safety and performance.

Comments

Popular posts from this blog

Dealing with Passwords in Java Applications: 5 Best Practices You Should Follow

 In modern Java applications—whether core Java applications or enterprise-level web applications—working with passwords is inevitable. Passwords are sensitive pieces of information, just like Social Security Numbers (SSNs), and if you’re handling real human data in systems such as online banking or healthcare portals, it’s critical to implement best practices for dealing with passwords securely. Below, I’ll share five essential best practices that I’ve learned and recommend for managing passwords, particularly when you are handling authentication and authorization. While these tips are a good starting point, be sure to tailor them to your application’s requirements and security policies. 1) Use SSL/TLS to Transfer Username and Password When users send passwords over the network, it is crucial to use SSL/TLS to encrypt the communication. This ensures that sensitive information is protected from eavesdroppers. Tools like LDAP and Active Directory are commonly used for storing usern...

Ace Your Java Interview: Top 50 Java Interview Questions & Answers (2025)

  Introduction Java continues to be a top programming language in 2025 , widely used in enterprise applications, microservices, cloud computing, and AI-based systems . If you're preparing for a Java developer interview , you must be well-versed in Core Java, Java 8-21 features, Spring Boot, Microservices, and Cloud technologies . This guide covers the top 50 Java interview questions for freshers and experienced professionals , ensuring you are ready for your next interview! Table of Contents Core Java Interview Questions Java 8, Java 11, and Java 21 Features OOP and Design Patterns Multithreading and Concurrency JVM, Garbage Collection & Memory Management Collections Framework Spring Boot & Microservices Cloud Technologies (AWS, Azure, GCP) Real-World Java Interview Scenarios 1. Core Java Interview Questions Q1: What are the key features of Java? Answer: Platform Independence – Java runs on JVM , making it OS-independent. Object-Oriented – Java follows...

JDK 25: The new features in Java 25

 Java Development Kit (JDK) 25, scheduled for release in September 2025, is set to introduce several significant enhancements. Here's an overview of the notable features: 1. Stable Values API (Preview): This feature introduces stable values—objects holding immutable data treated as constants by the Java Virtual Machine (JVM). By allowing greater flexibility in initialization timing compared to final fields, stable values aim to improve application startup times. They enable performance optimizations akin to constant-folding, previously exclusive to JDK code, and ensure thread-safe, single-time initialization. This decouples the creation of stable values from their initialization without significant performance penalties.  2. Removal of 32-bit x86 Port: JDK 25 plans to eliminate both the source code and build support for the 32-bit x86 port, which was deprecated in JDK 24. Maintaining this port has become less beneficial, especially with the challenges in keeping it updated wit...