Lombok @SuperBuilder doesn't accept parameters

3 min read 05-10-2024
Lombok @SuperBuilder doesn't accept parameters


Lombok's @SuperBuilder: Why It Doesn't Accept Parameters and How to Work Around It

Problem: You're trying to use Lombok's powerful @SuperBuilder annotation to generate a builder for your Java class, but you're encountering an error because it doesn't seem to accept any parameters.

Rephrased: Imagine you're building a house and want to use a tool that automatically constructs it based on your blueprint. But this tool, @SuperBuilder, only lets you build the house without any extra features or adjustments. You want to customize the building process, but the tool seems inflexible.

Let's delve into the issue and explore solutions:

The Scenario:

import lombok.SuperBuilder;

@SuperBuilder
public class MyObject {
    private String name;
    private int age;
    private boolean isActive;
}

In this example, we want to use @SuperBuilder to create a builder for MyObject. However, we may encounter a situation where we want to define custom behavior within the builder, like validating input values or setting default values.

Why @SuperBuilder Doesn't Accept Parameters:

Lombok's @SuperBuilder primarily focuses on generating a simple, efficient builder for your class. Its purpose is to simplify boilerplate code associated with object creation. It prioritizes automatic generation over customization, which explains the lack of parameter support.

Workarounds and Solutions:

While @SuperBuilder doesn't directly support parameters, here's how you can achieve the desired customization:

1. Manual Builder:

The most straightforward approach is to manually create your own builder class, which gives you complete control over its behavior. This allows you to implement any desired validation, default value setting, or complex logic.

public class MyObject {
    private String name;
    private int age;
    private boolean isActive;

    public static class MyObjectBuilder {
        private String name;
        private int age;
        private boolean isActive;

        public MyObjectBuilder name(String name) {
            this.name = name;
            return this;
        }

        public MyObjectBuilder age(int age) {
            this.age = age;
            return this;
        }

        public MyObjectBuilder isActive(boolean isActive) {
            this.isActive = isActive;
            return this;
        }

        public MyObject build() {
            return new MyObject(name, age, isActive);
        }
    }

    public MyObject(String name, int age, boolean isActive) {
        this.name = name;
        this.age = age;
        this.isActive = isActive;
    }
}

2. Custom Builder Method:

Instead of a separate builder class, you can define a custom builder method within your MyObject class. This method can take parameters and return a fully configured instance of MyObject.

import lombok.Builder;

@Builder
public class MyObject {
    private String name;
    private int age;
    private boolean isActive;

    public static MyObject build(String name, int age, boolean isActive) {
        return new MyObject(name, age, isActive);
    }

    public MyObject(String name, int age, boolean isActive) {
        this.name = name;
        this.age = age;
        this.isActive = isActive;
    }
}

3. @Builder.Default for Default Values:

You can use the @Builder.Default annotation to set default values for specific fields within your MyObject class. This provides a simple way to add pre-configured values without writing custom builder logic.

import lombok.Builder;

@Builder
public class MyObject {
    private String name;
    private int age;
    @Builder.Default
    private boolean isActive = false;
}

Conclusion:

While @SuperBuilder doesn't directly accept parameters, you can achieve the desired customization using manual builders, custom builder methods, or leveraging the @Builder.Default annotation. The best approach depends on the complexity and specific requirements of your builder logic.

Resources:

By understanding the limitations of @SuperBuilder and exploring the available workarounds, you can effectively utilize Lombok's powerful builders for streamlined object creation while maintaining the necessary customization for your specific use cases.