If I specify @AllArgsConstructor using Lombok, it will generate a constructor for setting all the declared (not final, not static) fields. Is it possible to omit some field and this leave generated constructor for all other fields?
-
2It wouldn't really be an all-args ctor then. – Dave Newton May 20 '14 at 13:36
-
4Sure thing. Maybe there is some solution with lombok? – user3656823 May 20 '14 at 13:42
5 Answers
No that is not possible. There is a feature request to create a @SomeArgsConstructor where you can specify a list of involved fields.
Full disclosure: I am one of the core Project Lombok developers.
- 3,938
- 7
- 44
- 71
- 28,994
- 8
- 64
- 56
-
19
-
16
-
2I hope we will see such a constructor in the upcoming 2021 (it looks like the feature request was rejected for reasons I don't understand) – Nikita Kobtsev Dec 22 '20 at 14:12
-
1See answer(s) about `@RequiredArgsConstructor`, as that annotation may meet most of the use-cases for OP's question. – Gordon Bean Mar 10 '21 at 19:32
-
7As you have with ```@EqualsAndHashCode.Exclude``` you could add ```@AllArgsConstructor.Exclude``` in front of the field. – Erick Audet Jan 22 '22 at 01:47
-
Alternatively, you could use @RequiredArgsConstructor. This adds a constructor for all fields that are either @NonNull or final.
See the documentation
- 11,532
- 21
- 93
- 164
-
1This is a nice workaround, using @NonNull. But be aware that this does not work with fields having default-values. – eeezyy Jun 28 '19 at 14:50
-
1This worked well for me, and I even marked the omitted field with `@Transient` to avoid it being tracked by java persistence layer since it was in my DAO. – Encryption Jan 13 '20 at 14:43
Just in case it helps, initialized final fields are excluded.
@AllArgsConstructor
class SomeClass {
final String s;
final int i;
final List<String> list = new ArrayList<>(); // excluded in constructor
}
var x = new SomeClass("hello", 1);
It makes sense especially for collections, or other mutable classes.
This solution can be used together with the other solution here, about using @RequiredArgsConstructor:
@RequiredArgsConstructor
class SomeClass2 {
final String s;
int i; // excluded because it's not final
final List<String> list = new ArrayList<>(); // excluded because it's initialized
}
var x = new SomeClass2("hello");
- 10,227
- 14
- 75
- 93
-
4Important addition: "initialized **final** fields are excluded" -> If the field is only initialized but not final the constructor (generated by AllArgsConstructor) will be generated with this field as well :) – oruckdeschel Jan 06 '21 at 09:21
-
Hi I wanna ask if there's any idea how to generate two types of constructors, for example one contains string s and int i and one contains string s and string F . – Compte Gmail Oct 31 '21 at 11:00
-
1Lombok is intended to generate code for common cases, not for specific scenarios. You should code your particular constructors explicitly. – Ferran Maylinch Nov 01 '21 at 19:23
-
Your answer helped a ton: in case the fields you want to exclude are final because they are constants. – avi.elkharrat Dec 16 '21 at 10:07
A good way to go around it in some cases would be to use the @Builder
- 3,938
- 7
- 44
- 71
- 5,909
- 6
- 33
- 51
-
-
Lets say "_a_ way" but not "a _good_ way". If you want an `AllArgsConstructor` to guarantee that the user provides all (required) members a std builder is _not_ the way to do it. – towi Jul 01 '21 at 09:32
-
This can be done using two annotations from lombok @RequiredArgsConstructor and @NonNull.
Please find the example as follows
package com.ss.model;
import lombok.*;
@Getter
@Setter
@RequiredArgsConstructor
@ToString
public class Employee {
private int id;
@NonNull
private String firstName;
@NonNull
private String lastName;
@NonNull
private int age;
@NonNull
private String address;
}
And then you can create an object as below
Employee employee = new Employee("FirstName", "LastName", 27, "Address");
- 129
- 1
- 6
-
Hi I wanna ask if there's any idea how to generate two type of constructors, for example one contains Age & Lastname, one cantains Address & Age – Compte Gmail Oct 31 '21 at 10:59
-
Hi @CompteGmail, it is better to define the constructors individually – Shubhasish Bhunia Nov 18 '21 at 08:46