Core Java

Setter Methods vs Constructors for Setting Variables in Java

In object-oriented programming (OOP) with Java, the decision to employ setter methods or constructors for setting variables is pivotal. Both mechanisms serve the purpose of initializing object states, but they differ in their use cases and flexibility. This article explores each approach and helps you decide when to use a Java constructor vs a setter method for setting variable values in your Java code.

1. The Role of Constructors

Constructors are fundamental components of Java classes responsible for initializing object states. They are special methods with the same name as the class that are invoked whenever we create a new object using the new keyword. Constructors offer several advantages:

  • Initialization: Constructors initialize the object’s state at the time of creation. This initialization ensures that the object is immediately ready for use without requiring additional method calls.
  • Immutable Properties: Constructors are ideal for initializing immutable properties, as they enable the object’s state to be set only once during instantiation. This immutability enhances thread safety and prevents unintended modification of object properties.
  • Enforcing Constraints: Constructors allow us to enforce constraints and validations during object creation. By validating input parameters within the constructor, we can ensure that the object is initialized with valid data.

1.1 When to Use Constructors

  • Immutable Objects: For classes where immutability is desired, constructors are the preferred choice for initializing properties.
  • Initialization with Mandatory Parameters: When certain parameters are mandatory for the object’s initialization and should not be omitted, constructors make it clear how to include them.
  • Enforcing Constraints: If the object requires specific constraints to be met during initialization, like making sure values aren’t empty or are within a certain range, constructors are well-suited for enforcing these constraints.

1.2 Java Constructor Example

Below is a constructor example:

class Person {
    private final String name;
    private final int age;

    // Constructor for initializing immutable properties
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter methods
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class ConstructorExample {

    public static void main(String[] args) {
       // Creating a Person object using the constructor
        Person person = new Person("John", 30);

        // Accessing properties using getter methods
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}


In this example, the Person constructor takes the name and age as arguments and assigns them to the corresponding instance variables. This ensures every Person object has a valid name and price upon creation.

2. The Role of Setter Methods

Setter methods, also known as mutator methods, are Java class methods used to modify the values of an object’s fields after its creation. Setter methods are often named with the prefix set followed by the variable name. Here is why we might consider using setters:

  • Flexibility: Setter methods enable dynamic modification of object properties. Not all variables may require immediate values. Setters allow you to leave certain properties unset during construction and define them later.
  • Encapsulation: By encapsulating the modification logic within setter methods, classes can maintain control over how their properties are modified, enforcing constraints or performing additional operations as needed.
  • Gradual Initialization: Setter methods facilitate gradual initialization, where object properties are set incrementally rather than all at once during object creation. This can be advantageous for scenarios where certain properties are determined at runtime.

2.1 When to Use Setter Methods

  • Mutable Objects: For classes representing mutable entities whose state can change after initialization, setter methods are preferred to facilitate dynamic property modification.
  • Optional or Configurable Properties: When object properties are optional or configurable and may not be known at the time of initialization, setter methods offer a convenient mechanism for setting these properties later.
  • Dynamic Updates: In scenarios where object properties need to be updated based on external factors or user input, setter methods allow for dynamic updates without requiring object reinitialization.

2.2 Setter Method Example in Java

class Car {

    private String make;
    private String model;
    private int year;

    // Setter methods for dynamic property modification
    public void setMake(String make) {
        this.make = make;
    }

    public void setModel(String model) {
        this.model = model;
    }

    // Setter method for year with validation
    public void setYear(int year) {
        // Validate year value before assigning
        if (year >= 1900 && year <= 2024) {
            this.year = year;
        } else {
            throw new IllegalArgumentException("Invalid year value. Please provide a year between 1900 and 2025.");
        }
    }

    // Getter methods
    public String getMake() {
        return make;
    }

    public String getModel() {
        return model;
    }

    public int getYear() {
        return year;
    }
}

public class SetterExample {

    public static void main(String[] args) {
        // Creating a Car object
        Car car = new Car();

        // Setting properties using setter methods
        car.setMake("Toyota");
        car.setModel("Camry");
        car.setYear(2022);

        // Accessing properties using getter methods
        System.out.println("Make: " + car.getMake());
        System.out.println("Model: " + car.getModel());
        System.out.println("Year: " + car.getYear());
    }
}

In this example, the setter methods allow for dynamic property modification in the Car class. The setYear method validates whether the provided year value falls within the range of 1900 to 2024 before assigning it to the year variable. This enforces data integrity and prevents invalid data from entering the object. If the provided value is outside this range, it throws an IllegalArgumentException and prints a message indicating an invalid year value as shown below:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid year value. Please provide a year between 1900 and 2024.
	at com.jcg.setterexample.Car.setYear(SetterExample.java:31)
	at com.jcg.setterexample.SetterExample.main(SetterExample.java:58)
Command execution failed.

If the year value falls within the valid range, the output is:

Fig 1: Java setter method example output
Fig 1: Java setter method example output

3. Choosing the Right Tool

When do we use constructors or setter methods?

  • Use constructors for:
    • Essential properties that must be initialized before the object is usable.
    • Setting final variables, which cannot be changed after object creation.
  • Use setter methods for:
    • Optional properties that may not require immediate values.
    • Performing validation or additional logic before assigning a value.

Ultimately, the best approach depends on the specific use case and how we want to control the object’s state

Additional Considerations:

  • Immutable Objects: If you want to create immutable objects (objects whose state cannot be changed after creation), we will rely solely on constructors for initialization.
  • Encapsulation: Both constructors and setters promote encapsulation by controlling access to an object’s internal state.

4. Conclusion

In this article, we explored the differences between using setter methods and constructors for setting variables in Java showing some code examples. In conclusion, the choice between setter methods and constructors for setting variables depends on the specific requirements of the class being developed. Constructors are ideal for initializing immutable properties, enforcing constraints, and ensuring object validity at the time of creation. On the other hand, setter methods provide flexibility for modifying object properties dynamically.

5. Download the Source Code

This was an article on the setter method vs constructor in Java.

Download
You can download the full source code of this example here: Java setter method vs constructor

Omozegie Aziegbe

Omos holds a Master degree in Information Engineering with Network Management from the Robert Gordon University, Aberdeen. Omos is currently a freelance web/application developer who is currently focused on developing Java enterprise applications with the Jakarta EE framework.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button