# Complete Guide to Lombok

# Introduction

Lombok is a Java library that helps reduce boilerplate code by automatically generating commonly used methods like **constructors, getters, setters, toString, equals, hashCode**, and more.

# Different annotations

Different annotations in Lombok

1. Constructor
    
2. Getters and Setters
    
3. Other Useful Annotations
    

## Constructor Annotations

There are 4 important constructor annotations

1. @NoArgsConstructor
    
2. @AllArgsConstructor
    
3. @RequiredArgsConstructor
    
4. @Builder
    

### @NoArgsConstructor

> Required for frameworks like **JPA**, **Jackson**, and **Hibernate**.

**Without Lombok API**

```java
public Employee() { }
```

**With Lombok API**

```java
import lombok.NoArgsConstructor;

@NoArgsConstructor
public class Employee {
    private String name;
    private int age;
}
```

### @AllArgsConstructor(Constructor with All Fields)

> Used to create fully initialized objects.

**Without Lombok API**

```java
public Employee(String name, int age) {
    this.name = name;
    this.age = age;
}
```

**With Lombok API**

```java
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class Employee {
    private String name;
    private int age;
}
```

### @RequiredArgsConstructor(Constructor for `final` or `@NonNull` Fields)

> Generates a constructor for **only required fields**.

**Without Lombok API**

```java
public Employee(String name) {
    this.name = name;
}
```

**With Lombok API**

```java
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class Employee {
    private final String name;
    private int age;
}
```

### @Builder (Fluent Builder Pattern)

> Useful for creating objects with **optional parameters**.

**Without Lombok API**

```java
package com.module02.builder;

public class Employee {
    private final String name;
    private final int age;

    private Employee(EmployeeBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
    }

    public static class EmployeeBuilder {
        private String name;
        private int age;

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

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

        public Employee build() {
            return new Employee(this);
        }
    }

    public static EmployeeBuilder builder() {
        return new EmployeeBuilder();
    }

    @Override
    public String toString() {
        return "Employee{name='" + name + "', age=" + age + "}";
    }
}

# Main Class
Employee employee = Employee.builder().name("Naveen").age(38).build();
        System.out.println(employee);
```

**With Lombok**

```java
import lombok.Builder;

@Builder
public class Employee {
    private String name;
    private int age;
}
```

## Getters and Setters Annotations

There are 3 important constructor annotations

1. `@Getter`
    
2. `@Setter`
    
3. `@Data`
    

### @Getter (Generates Getter Methods)

> Automatically generates **getter methods**.

**Without Lombok**

```java
package com.module02.builder;

public class Employee {
    private final String name;
    private final int age;

    private Employee(EmployeeBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
    }

    public static class EmployeeBuilder {
        private String name;
        private int age;

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

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

        public Employee build() {
            return new Employee(this);
        }
    }

    public static EmployeeBuilder builder() {
        return new EmployeeBuilder();
    }

    @Override
    public String toString() {
        return "Employee{name='" + name + "', age=" + age + "}";
    }
}




# Main Class
Employee employee = Employee.builder().name("Naveen").age(38).build();
        System.out.println(employee);
System.out.println(employee)
```

**With Lombok API**

```java
import lombok.Getter;

@Getter
public class Employee {
    private String name;
    private int age;
}
```

### @Setter (Generates Setter Methods)

**Without Lombok API**

```java
public void setName(String name) {
    this.name = name;
}

public void setAge(int age) {
    this.age = age;
}
```

**With Lombok API**

```java

import lombok.Setter;

@Setter
public class Employee {
    private String name;
    private int age;
}
```

### @Getter and @Setter on Specific Fields

> If you want getters and setters for **only some fields**.

**Without Lombok API**

```java
public String getName() { return name; }
public void setName(String name) { this.name = name; }

public int getAge() { return age; }
```

**With Lombok API**

```java
import lombok.Getter;
import lombok.Setter;

public class Employee {
    @Getter @Setter
    private String name;

    @Getter
    private int age; // Read-only field
}
```

### Restricting Getter and Setter Access

> Control **access level** of getters and setters.

**Without Lombok API**

```java
protected String getName() { return name; }
private void setAge(int age) { this.age = age; }
```

**With Lombok API**

```java
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

public class Employee {
    @Getter(AccessLevel.PROTECTED)
    private String name;

    @Setter(AccessLevel.PRIVATE)
    private int age;
}
```

## Other Useful Annotations

1. `@ToString`
    
2. `@EqualsAndHashCode`
    
3. `@Value` (Immutable class)
    
4. `@Builder`
    
5. `@Slf4j`
    

### @Data (Combines Getters, Setters, and More)

> Generates **getters, setters,** `toString()`, `equals()`, and `hashCode()`.

**Without Lombok API**

```java
public class Employee {
    private String name;
    private int age;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

    @Override
    public String toString() { return "Employee{name='" + name + "', age=" + age + "}"; }
    
    @Override
    public boolean equals(Object obj) { ... } 
    @Override
    public int hashCode() { ... }
}
```

**With Lombok API**

```java
import lombok.Data;

@Data
public class Employee {
    private String name;
    private int age;
}
```

### @ToString (Generates toString() Method)

**Without Lombok API**

```java
@Override
public String toString() {
    return "Employee(name=" + name + ", age=" + age + ")";
}
```

**With Lombok API**

```java
import lombok.ToString;

@ToString
public class Employee {
    private String name;
    private int age;
}
```

### @EqualsAndHashCode (Generates equals() and hashCode())

> Used for **object comparison**.

**Without Lombok API**

```java
@Override
public boolean equals(Object o) { ... }

@Override
public int hashCode() { ... }
```

**With Lombok API**

```java
import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class Employee {
    private String name;
    private int age;
}
```

### @Value (Immutable Class)

> Creates **immutable objects** (like DTOs).

**With Lombok API**

```java
import lombok.Value;

@Value
public class Employee {
    String name;
    int age;
}
```

* All fields are **private final**.
    
* No setters are generated.
    
* Generates **getters,** `toString()`, `equals()`, and `hashCode()`.
    

### @Slf4j (Logger)

```java
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class EmployeeService {
    public void processEmployee() {
        log.info("Processing employee...");
    }
}
```
