Prabhat Ranjan
Prabhat Ranjan

Reputation: 398

Lombok @Wither, @Value, @NoArgsConstructor, @AllArgsConstructor do not work together

I am writing a simple model as below. I can see the wither function in intellij structure view. but compiler complains about "variable field1 might not have been initialized"

@Wither
@Value
@NoArgsConstructor
@AllArgsConstructor
public class MyModel {
    String field1;
    String field2;
}

If I initialize the fields, I donot see wither functions anymore. What could be happening here?

Upvotes: 1

Views: 7536

Answers (1)

Damir Alibegovic
Damir Alibegovic

Reputation: 318

As from the documentation:

@Value is the immutable variant of @Data; all fields are made private and final by default, and setters are not generated.


So String field1 becomes final String field1.

Since you are also using @NoArgsConstructor Java compiler complains that "variable field1 might not have been initialized", which is true, since somewhere in the code you can do

MyModel model = new MyModel();

and since the constructor does not initialize any fields, Java complains.

From Final (Java) wiki:

A final variable can only be initialized once, either via an initializer or an assignment statement. It does not need to be initialized at the point of declaration: this is called a "blank final" variable. A blank final instance variable of a class must be definitely assigned in every constructor of the class in which it is declared; similarly, a blank final static variable must be definitely assigned in a static initializer of the class in which it is declared; otherwise, a compile-time error occurs in both cases.


And this is exactly what happens in your case.

Upvotes: 5

Related Questions