[Simplifique o desenvolvimento] Uso de lombok, código compilado e código-fonte


O artigo é longo e pode ser lido sob demanda

Importar dependências

Primeiro, o projeto Maven importa dependências em pom.xml

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

一、@getter、@Setter、@toString

1. @getter e @Setter geram métodos getxxx() e setxxx() respectivamente

Você pode adicionar anotações às variáveis ​​de membro que precisam gerar métodos getter e setter.
E se for adicionado a uma classe, mas uma determinada variável de membro precisar gerar getters e setters especiais?
Você pode escrever diretamente manualmente os métodos getter e setter da variável.Quando o lombok detectar que você escreveu os métodos getter e setter correspondentes para a variável, ela não será mais gerada automaticamente.

2. @toString gera o método toString(), que imprime o nome da classe e cada campo em ordem, separados por vírgulas

Por exemplo, @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

1. Construtor sem parâmetros @NoArgsConstructor

@NoArgsConstructorAs anotações possuem quatro parâmetros de atributos: staticName, onConstructor, access e force, que podem ser configurados:

nome estático

staticName representa se deve gerar um construtor estático. Ou seja, quando o atributo staticName tiver um valor, um construtor estático será gerado. Neste momento, o construtor sem argumento será privado e, em seguida, um construtor estático com o especificado nome será criado e será público. , conforme mostrado abaixo:

/**
 * 编译前代码
 */
@RequiredArgsConstructor(staticName = "UserStatic")
public class UserInfo() {
    
    
	
    private String username;
    private String password;
}

/**
 * 编译后代码
 */
public class UserInfo() {
    
    
	
    private String username;
    private String password;
    
    private UserInfo() {
    
    
    }
    
    public UserStatic() {
    
    
    	return new UserStatic();
    }
}

onConstructor

onConstructor
Pessoas que frequentemente escrevem código Spring ou SpringBoot devem saber que Spring fornece três maneiras de escrever injeção de dependência, ou seja, injeção de propriedade, injeção de método Setter e injeção de construtor. No entanto, no trabalho diário, confiamos principalmente no método @Autowired Annotation é usado para injeção de dependência . No entanto, muita injeção de dependência tornará nosso código muito detalhado. Até mesmo esse método de escrita foi descontinuado desde o Spring 4.0. Em vez disso, é recomendado usar injeção de método Setter e injeção de construtor, além de geração de lombok. O método construtor pode implementar isso facilmente. método de escrita.
Dê um exemplo de injeção via construtor:

@Controller
public class SysLoginController() {
    
    
	
    private final TokenUtils tokenUtils;
    
    private final SysLoginService sysLoginService;
    
    /**
     * 在这里 @Autowired 是可以省略的,在这里使用只是为了介绍 onConstructor 参数
     */
    @Autowired
    public SysLoginController (TokenUtils tokenUtils, SysLoginService sysLoginService) {
    
    
    	
        this.tokenUtils = tokenUtils;
        this.sysLoginService = sysLoginService;
    }
}

Quando o número de beans injetados é grande, ainda precisamos escrever muito código. Neste momento, podemos usar a anotação @RequiredArgsConstructor para resolver esse problema. Por que não usar a anotação @AllArgsConstructor, é porque esta anotação é para todos os parâmetros, e nesta situação, precisamos apenas construir as propriedades correspondentes ao Bean ao invés do não-Bean, então só precisamos modificar as propriedades correspondentes ao Bean com a palavra-chave final para gerar apenas os parametrizados necessários construtor, conforme mostrado abaixo:

/**
 * 编译前
 */
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SysLoginController() {
    
    
	
    private final TokenUtils tokenUtils;
    
    private final SysLoginService sysLoginService;
}

/**
 * 编译后
 */
public class SysLoginController() {
    
    
	
    private final TokenUtils tokenUtils;
    
    private final SysLoginService sysLoginService;
    
    @Autowired
    public SysLoginController (TokenUtils tokenUtils, SysLoginService sysLoginService) {
    
    
    	
        this.tokenUtils = tokenUtils;
        this.sysLoginService = sysLoginService;
    }
}

acesso

Às vezes usaremos o modo singleton. Nesse caso, precisamos criar um construtor privado sem parâmetros. Em seguida, podemos usar um atributo como access para definir as permissões do construtor, conforme mostrado abaixo:

/**
 * 编译前代码
 */
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class UserInfo() {
    
    
	
    private String username;
    private String password;
}

/**
 * 编译后代码
 */
public class UserInfo() {
    
    
	
    private String username;
    private String password;
    
    private UserInfo() {
    
    
    }
}

Níveis opcionais de acesso:
public enum AccessLevel { PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE, NONE;





private AccessLevel() {
}

}

força

Quando um campo modificado pela palavra-chave final em uma classe não foi inicializado, o compilador reportará um erro.Neste momento, você também pode definir o atributo force como true para gerar um valor padrão de 0/false/null para o campo com base no tipo, para que o compilador não Um erro será relatado novamente, conforme mostrado abaixo:

/**
 * 编译前代码
 */
@RequiredArgsConstructor(force = true)
public class UserInfo() {
    
    
	
    private final String gender;
    private String username;
    private String password;
}

/**
 * 编译后代码
 */
public class UserInfo() {
    
    
	
    private final String gender = null;
    private String username;
    private String password;
    
    private UserInfo() {
    
    
    }
}

2、@RequiredArgsConstructor

@RequiredArgsConstructorUtilizada em uma classe, esta anotação pode gerar um construtor com ou sem parâmetros.
Se parâmetros forem fornecidos, eles só poderão ser campos não inicializados anotados com @NonNull e modificados com final na classe, conforme mostrado abaixo:

/**
 * 编译前代码
 */
@RequiredArgsConstructor
public class UserInfo() {
    
    
	
    private final String gender;
    @NonNull
    private String username;
    private String password;
}

/**
 * 编译后代码
 */
public class UserInfo() {
    
    
	
    private final String gender;
    @NonNull
    private String username;
    private String password;
    
    public UserInfo(String gender, @NonNull String username) {
    
    
    	
        if (username == null) {
    
    
        	throws new NullPointerException("username is marked @NonNull but is null");
        } else {
    
    
        	this.gender = gender;
            this.username = username;
        }
    }
}

@NoArgsConstructorConsulte o código-fonte para obter uma explicação detalhada da configuração dos parâmetros.

3、@AllArgsConstructor

@AllArgsConstructor é usado em uma classe.Esta anotação pode gerar um construtor de parâmetros completos e não gera um construtor sem parâmetros por padrão.
No entanto, deve-se observar que os parâmetros completos mencionados aqui não incluem campos que foram inicializados e modificados pela palavra-chave final, porque uma vez que um campo é modificado pela palavra-chave final e recebe um valor, ele não pode ser modificado, conforme mostrado abaixo :

/**
 * 编译前代码
 */
@RequiredArgsConstructor
public class UserInfo() {
    
    
	
    private final String gender;
    private final Integer age = 18;
    
    private String username;
    private String password;
}

/**
 * 编译后代码
 */
public class UserInfo() {
    
    
	
    private final String gender;
    private final Integer age = 18;
    
    private String username;
    private String password;
    
    public User(String gender, String username, String password) {
    
    
    	
        this.gender = gender;
        this.username = username;
        this.password = password;
    }
}

@NoArgsConstructorConsulte o código-fonte para obter uma explicação detalhada da configuração dos parâmetros.

3. @Dados

A anotação @Data contém @Getter@Setter e possui métodos como toString(), equals(), canEqual(), etc.

四、@Builder、@Singular

@Construtor

Nos cenários de uso diário do lombok, sempre encontraremos a situação em que o objeto contém uma coleção.Nesse caso, precisamos usar o método set para atribuir o valor à coleção no objeto como outros atributos:

@Data
@Builder
class Student{
    
    
    private String name;
    private List<String> skills;
}

Análise do código-fonte do construtor:

public static class StudentBuilder {
    
    
	// 省略其他部分
    public Student.StudentBuilder skills(List<String> skills) {
    
    
        this.skills = skills;
        return this;
    }
}

Não se pode dizer que esta forma de inicializar as propriedades do conjunto esteja errada, mas ainda não é fácil de usar. Quando construímos um conjunto, adicionamos principalmente elementos a ele, então existe uma maneira de adicionar elementos especificamente a este conjunto , e ao mesmo tempo Quanto à instanciação de uma coleção que está oculta dentro do código, a resposta é sim, esse é o papel do @Singular apresentado a seguir.

@Singular

/**
 * 编译前代码
 */
@Builder
class Student{
    
    
    private String name;
    @Singular
    private List<String> skills;
}

/**
 * 编译后代码
 */
class Student {
    
    
    private String name;
    private List<String> skills;

    Student(String name, List<String> skills) {
    
    
        this.name = name;
        this.skills = skills;
    }

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

    public static class StudentBuilder {
    
    
        private String name;
        private ArrayList<String> skills;

        StudentBuilder() {
    
    
        }

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

        public StudentBuilder skill(String skill) {
    
    
            if (this.skills == null) {
    
    
                this.skills = new ArrayList();
            }

            this.skills.add(skill);
            return this;
        }

        public StudentBuilder skills(Collection<? extends String> skills) {
    
    
            if (skills == null) {
    
    
                throw new NullPointerException("skills cannot be null");
            } else {
    
    
                if (this.skills == null) {
    
    
                    this.skills = new ArrayList();
                }

                this.skills.addAll(skills);
                return this;
            }
        }

        public StudentBuilder clearSkills() {
    
    
            if (this.skills != null) {
    
    
                this.skills.clear();
            }

            return this;
        }

        public Student build() {
    
    
            List skills;
            switch (this.skills == null ? 0 : this.skills.size()) {
    
    
                case 0:
                    skills = Collections.emptyList();
                    break;
                case 1:
                    skills = Collections.singletonList(this.skills.get(0));
                    break;
                default:
                    skills = Collections.unmodifiableList(new ArrayList(this.skills));
            }

            return new Student(this.name, skills);
        }

        public String toString() {
    
    
            return "Student.StudentBuilder(name=" + this.name + ", skills=" + this.skills + ")";
        }
    }
}

Comparando com o código anterior, após adicionar a anotação @Singular, o lombok adicionou um método skill() para adicionar elementos à coleção. Quando não especificamos o nome do método, o lombok derivará automaticamente o nome do método com base no inglês, como: habilidades -> habilidade, o nome da coleção é: habilidades, então removerá o plural e a palavra restante será o nome do método. Podemos personalizar o nome do método @Singular("addSkill"). Se for usada uma nomenclatura não padrão, o nome do método deverá ser especificado.

Se houver algum erro, por favor me avise!
Ao reimprimir ou citar o conteúdo deste artigo, indique a fonte e o autor original: Juzu Qingzhong;

Acho que você gosta

Origin blog.csdn.net/weixin_44510587/article/details/129286919
Recomendado
Clasificación