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

What is JDK, JRE and JVM?

What are JDK, JRE, and JVM: JDK :- Java Development Kit (in short JDK) is Kit which provides the environment to Develop and execute(run ) the Java program. For eg. You(as Java Developer) are developing an accounting application on your machine, so what do you going to need into your machine to develop and run this desktop app? You are going to need  J-D-K  for that purpose for this you just need to go to the official website of sun or oracle to download the latest version of JDK into your machine. Hence, JDK is a kit(or package) which includes two things i) Development Tools(to provide an environment to develop your java programs) and ii) JRE (to execute your java program). JDK is only used by Java Developers. JRE: - Java Runtime Environment (to say JRE) is an installation package which provides an environment to only run(not develop) the java program(or application)onto your machine. For eg(continuing with the same example) after developing your accounting ap...

The Future of Java Developers in the Age of AI and ChatGPT

  In today's rapidly evolving tech landscape, AI tools like ChatGPT are becoming more integrated into the software development process. As a Java developer, whether you're just starting out or have years of experience, you might wonder: How can I stay relevant and succeed in the age of AI? In this post, we'll explore practical strategies to ensure you not only survive but thrive as a Java developer in this AI-driven world. 1. Embrace AI as a Tool, Not a Threat AI isn't here to replace you—it's here to help you. Tools like ChatGPT can automate repetitive tasks, assist with coding challenges, and even generate code snippets, allowing you to focus on more complex and creative aspects of development. For Freshers: Use AI tools to learn and understand Java more quickly. Let them assist you in writing code, but make sure you're also learning the logic and concepts behind it. For Experienced Developers: Integrate AI tools into your workflow to enhance productivity. L...

What are the best opportunities for java in 2021?

Firstly, Java is widely used for building enterprise-scale web applications. Java is known to be extremely stable and so, many large enterprises have adopted it. If you are looking for a development based job at a large organization, Java is the language that you should learn. It is widely used in Android App Development. So if anyone is willing to find a career in Android App Development, he/she should have an intermediate level of experience in Java. Some of the different domains where Java is used widely are as follows: Financial services:  It is used in server-side applications. Big Data:  Hadoop MapReduce framework is written using Java. Banking:  To deal with transaction management. Stock market:  To write algorithms as to which company they should invest in. Retail:  Billing applications that you see in a store/restaurant are completely written in Java. Android:  Applications are either written in Java or use Java API. Scientific and Research Communi...