Java Lombok不常用注解

参考资料

  1. 最全的 lombok 注解详情(随着版本不定时更新)
  2. @Accessors 注解极简教程
  3. Lombok工具 : 常用注解介绍 (全)

目录

  • 一. @Accessors
    • 1.1 fluent 属性
    • 1.2 chain 属性
    • 1.3 prefix 属性
  • 二. @Builder
  • 三. @Singular
  • 四. @Cleanup
  • 五. @RequiredArgsConstructor
  • 六. @ExtensionMethod


一. @Accessors

  • 可以同时作用于类和属性上,属性上的优先级 > 类上的优先级

1.1 fluent 属性

  • 默认值为false
  • 当为 true 时,对应字段的 getter 方法前面就没有 get,setter 方法就不会有 set
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(fluent = true)
public class Student {

    private String personId;

    private String personName;

    private String age;

    private String address;

    public static void main(String[] args) {
        
        Student student = new Student();
        
        // 不需要set
        student.age("1");
        student.address("地球");
    
        // 不需要get
        student.personId();
        student.personName();
    }
}

1.2 chain 属性

  • 默认值为false
  • 当为 true 时,对应字段的 setter 方法调用后,会返回当前对象
import lombok.Data;
import lombok.experimental.Accessors;

@Data
// 左右于类上,表示所有的属性都可以链式调用
@Accessors(chain = true)
public class Student {

    private String personId;

    private String personName;
	
	// 作用于属性上,表示这个属性不链式调用
    @Accessors(chain = false)
    private String age;

    private String address;

    public static void main(String[] args) {

        Student student = new Student();

        student.setPersonId("1")
                .setPersonName("贾飞天")
                // age属性并不链式调用,所以不会返回对象本身
                .setAge("10");
    }
}

1.3 prefix 属性

  • 该属性是一个字符串数组
  • 当该数组有值时,表示忽略字段中对应的前缀,生成对应的 getter 和 setter 方法。
import lombok.Data;
import lombok.experimental.Accessors;

@Data
// 忽略属性前缀person和human,并且链式调用
@Accessors(prefix = {"person", "human"}, chain = true)
public class Student {

    private String personId;

    private String humanName;
    
    private String age;

    private String address;

    public static void main(String[] args) {

        Student student = new Student();
        // 前缀person和human被忽略
        student.setId("1")
                .setName("贾飞天")
                .setAge("18")
                .setAddress("地球");
    }
}

二. @Builder

  • 通过建造者模式创建对象
  • 会生成一个全参的构造函数,如果我们使用无参构造函数的话就会报错
import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Student {

    private String personId;

    private String humanName;

    private String age;
	
	// 非 final 的字段可以有默认值
    @Builder.Default
    private String address = "地球";

    public static void main(String[] args) {

        Student student = Student.builder()
                .personId("1")
                .humanName("贾飞天")
                .age("10")
                // 没有创建address属性
                .build();
        System.out.println(student);
        /*
        	因为我们使用@Builder.Default给address指定了默认值
        	Student(personId=1, humanName=贾飞天, age=10, address=地球)
		*/
    }
}

三. @Singular

  • 该注解需要配合@Builder注解使用,用于注解一个集合字段
  • 如果没有指定value值的话,那么集合字段名需要是复数形式
  • 如果指定了value值,集合字段名就是我们指定的value值
  • 会生成添加元素方法向集合添加单个元素
import lombok.Builder;
import lombok.Data;
import lombok.Singular;

import java.util.List;

@Builder
@Data
public class Student {

    private String personId;

    private String humanName;

    private String age;

    /**
     * 属性名结尾不为 s ,
     * 因此必须在@Singular注解中手动指定构建时使用的名称
     */
    @Singular("address")
    private List<String> addressList;

    /**
     * 属性名结尾为 s,
     * 因此可以不手动指定构建时使用的名称,该名称为去掉s之后的属性名
     */
    @Singular
    private List<String> hobbys;

    public static void main(String[] args) {


        Student student = Student.builder()
                .personId("110")
                .humanName("贾飞天")
                // 可以一个一个向集合中添加元素,无需创建一个集合
                .address("地球").address("火星")
                .hobby("吃饭").hobby("睡觉")
                .build();
        System.out.println(student);
        /**
         * Student(
         *  personId=110,
         *  humanName=贾飞天,
         *  age=null,
         *  addressList=[地球, 火星],
         *  hobbys=[吃饭, 睡觉]
         * )
         */
    }
}

四. @Cleanup

  • 作用于局部变量,可以自动关闭资源
  • 仅针对实现了java.io.Closeable接口的对象有效
import lombok.Cleanup;
import java.io.File;
import java.io.FileInputStream;

public static void main(String[] args) throws IOException {

    @Cleanup FileInputStream inputStream = new FileInputStream(new File("D:\\test\\application.yml"));
    byte[] bytes = inputStream.readAllBytes();
    System.out.println(Arrays.toString(bytes));
}

编译后

Java Lombok不常用注解_第1张图片

五. @RequiredArgsConstructor

⏹具体使用请参考这篇博客
SpringBoot 使用lombok的@RequiredArgsConstructor注解进行Bean注入

六. @ExtensionMethod

  • 作用于类,向类中添加方法。
  • 要添加的方法的修饰符必须是 public,必须是静态方法,方法必须要有对应的参数,变量必须初始化。

⏹定义一个工具类

public class StringExtension {

	// 判断字符串是否为null或者空字符串
	public static boolean isNullOrEmpty(String str) {

		if (str == null || str.equals("")) {
			return true;
		} 
		
		return false;
	}
	
	// 判断不是null或空字符串
	public static boolean isNotNullOrEmpty(String str) {

		return !isNullOrEmpty(str);
	}
}

⏹使用

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;
import lombok.experimental.ExtensionMethod;

@Service
// 将StringExtension类添加到当前类中
@ExtensionMethod({ StringExtension.class })
public class Test implements CommandLineRunner {

	@Override
	public void run(String... args) throws Exception {
		
		// 需要做判断的值
		String value = null;
		
		// 使用@ExtensionMethod注解之前的常规写法
		boolean valueResult1 = StringExtension.isNullOrEmpty(value);
		System.out.println(valueResult1);  // true
		
		/**
		 * 使用@ExtensionMethod注解之后,
		 * StringExtension类中的方法默认添加到当前类中,
		 * 虽然value的值为null,但是在编译的时候会进行处理,处理为常规写法这种形式
		 */
		boolean valueResult2 = value.isNullOrEmpty();
		System.out.println(valueResult2);  // true
	}
}

你可能感兴趣的:(Java,lombok)