关联:Lombok 简介编译异常

代码示例:SpringBoot-Labs-Junw jLab-2-1

官方文档:Project Lombok

安装/引用

<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
</dependency>

1. @Data

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

public class TestData {
	// 生成 get、set、toString、equals、hashCode;
    @Test
    public void testPerson() {
        Person person = new Person();
        person.setName("John");
        person.setAge(30);

        assertEquals("Person(name=John, age=30)", person.toString());
    }

}

2. @Slf4j

@Slf4j
public class LoggerTest {

    /**
     * 说明:@Slf4j注释为类生成一个记录器实例,该实例可用于记录消息。
     */
    @Test
    public void testLogger() {
        log.info("Hello, world!");
        // Verify that the log message is printed
    }

}

3. @Cleanup

public class CleanupTest {

    /**
     * 使用 @Cleanup 注解处理需要关闭的资源,例如 InputStream、OutputStream、Reader、Writer、Connection 等。
     * 将 @Cleanup 注解放置在局部变量声明上,如例所示。
     * @throws Exception
     */
    @Test
    public void testCleanup() throws Exception {
        @Cleanup InputStream inputStream = new FileInputStream("src/test/resources/example.txt");
        // 使用 inputStream 进行一些操作
        byte[] buffer = new byte[1024];
        int bytesRead = inputStream.read(buffer);

        // 确认读取的数据不为空
        assertNotNull(buffer);

        // inputStream 会在这里自动关闭
    }

}

4. @Builder

@Data
@Builder
public class PersonB {
    private String name;
    private int age;
}


public class BuilderTest {
    /**
     * 说明:@Builder注释为 Person 类生成一个构建器类,该类可用于以流畅的 API 样式创建该类的实例。
     */
    @Test
    public void testBuilder() {
        PersonB person = PersonB.builder()
                .name("John")
                .age(30)
                .build();
        assertEquals("John", person.getName());
        assertEquals(30, person.getAge());
    }
}

5. @Accessors

5.1 fluent = true

@Data
@Accessors(fluent = true)
public class PersonC {
    private String name;
    private int age;
}

public class AccessorsTest {
    /**
     * fluent
     * 默认为false,设置为true时,调用getter、setter方法时,可以省略掉get、set直接[.属性]
     */
    @Test
    public void testAccessorsFluent() {
        PersonC person = new PersonC();
        person.name("John");
        person.age(30);
        assertEquals("John", person.name());
        assertEquals(30, person.age());
    }
}

5.2 chain = true

@Data
@Accessors(chain = true)
public class PersonD {
    private String name;
    private int age;
}

public class AccessorsTest {
    /**
     *  chain
     * 默认为false,设置为true时,对应字段的 setter 方法调用后,会返回当前对象。
     * 且可实现链式编程
     */
    @Test
    public void testAccessorsChain() {
        PersonD person = new PersonD().setName("John").setAge(30);
        assertEquals("John", person.getName());
        assertEquals(30, person.getAge());
    }
}

5.3 prefix = {"xx","yy"}

@Data
@Accessors(prefix = {"xx","yy"})
public class PersonE {
    private String xxName;
    private int yyAge;
}

public class AccessorsTest {
    /**
     * prefix
     * 该属性是一个字符串数组,当该数组有值时,表示忽略字段中对应的前缀,生成对应的 getter 和 setter 方法。
     */
    @Test
    public void testPersonPrefix() {
        PersonE person = new PersonE();
        person.setName("John");
        person.setAge(30);

        assertEquals("PersonE(xxName=John, yyAge=30)", person.toString());
    }
}

6. @NonNull

/**
 * @NonNull注释用于指示方法参数或返回值不能为 null。
 */
public class NonNullTest {


    @NonNull
    public String getNonNullString() {
        return "Hello";
    }

    /**
     * 说明: @NonNull注释指示 getNonNullString() 方法返回非 null 值。
     */
    @Test
    public void testNonNull() {
        String nonNullString = getNonNullString();
        assertNotNull(nonNullString);
    }


}

7. @SneakyThrows

/**
 * @SneakyThrows注释用于自动将方法或代码块包装在 try-catch 块中,该块将异常作为运行时异常重新抛出。
 */
public class SneakyThrowsTest {

    /**
     * 当你想编写抛出检查型异常的代码,但不想在方法签名中声明这些异常时,可以使用 @SneakyThrows。
     * 将 @SneakyThrows 注解放置在抛出检查型异常的方法或代码块上。
     */
    @SneakyThrows
    public void throwException() {
        throw new IOException("Example exception");
    }

    @Test
    public void testSneakyThrows() {
        try {
            throwException();
            fail("Expected exception to be thrown");
        } catch (RuntimeException e) {
            assertEquals("java.io.IOException: Example exception", e.getMessage());
        }
    }
}

8. @Synchronized

/**
 * @Synchronized注释用于自动同步方法或代码块。
 */
public class SynchronizedTest {

    private int counter = 0;

    @Synchronized
    public void incrementCounter() {
        counter++;
    }

    /**
     * 说明:@Synchronized注解同步 incrementCounter() 方法,确保一次只能有一个线程执行它。
     */
    @Test
    public void testSynchronized() {
        incrementCounter();
        assertEquals(1, counter);
    }

}