[Coleção de plug-ins] Você os usará ao escrever código?

Prefácio

O Eclipse / IDEA fornece um sistema de desenvolvimento de plug-in extensível, que permite implementar várias funções no sistema em execução. Em nosso desenvolvimento diário, o uso razoável de alguns plug-ins pode melhorar muito nossa eficiência de desenvolvimento. O que se segue é apenas um resumo do meu trabalho diário e uma compilação de plug-ins comumente usados, espero ajudar a todos ~

Um, Lombok

O Lombok é uma ferramenta que pode nos ajudar a simplificar e eliminar alguns códigos JAVA inchados por meio de anotações simples. Ao usar as anotações correspondentes, o método correspondente pode ser gerado quando o código é compilado, para que nosso código pareça mais organizado e conciso. Por exemplo, uma série de métodos como getter e setter na classe de entidade.

1. Instalação do Lombok

1.1 IDEIA instalar o Lombok

1. Instalação online: Menu Arquivo-> Configurações-> Plug-ins-> Navegar nos
repositórios ...-> Pesquisar lombok-> obter o plug-in resultante do Lombok, fazer download (instalar) e reiniciá-lo.
2. Instalação off-line: primeiro baixe lombok.jar, baixe URL: lombok.jar, em seguida, menu Arquivo-> Configurações-> Plug-ins-> Instalar
plug do disco-> selecione o lombok.jar que você baixou e aplique-> OK, Reiniciar está ok.

1.2 Eclipse instalar o Lombok

(1) Primeiro faça download de lombok.jar e abra o diretório de instalação de myeclipse ou eclipse e localize o diretório de arquivo onde myeclipse.ini / eclipse.ini está localizado.

(2) Abra myeclipse.ini / eclipse.ini e adicione no final da configuração

-javaagent: lombok.jar

-Xbootclasspath / a: lombok.jar

(3) Reinicie o myeclipse ou eclipse após salvar.

2. Use lombok no projeto Java maven, adicione a dependência do Lombok

<dependency>

          <groupId>org.projectlombok</groupId>

          <artifactId>lombok</artifactId>

          <version>1.16.18</version>

          <scope>provided</scope>

 </dependency>	

O escopo do Lombok = fornecido significa que ele só entra em vigor durante a fase de compilação e não precisa ser incluído no pacote. Este é o fato de que o Lombok compila corretamente os arquivos Java com as anotações do Lombok em arquivos de classe completos durante a compilação.

3. Uso de anotações do Lombok

@ Getter / @ Setter: Na classe de função, gere os métodos getter / setter de todas as variáveis ​​de membro; ao atuar na variável de membro, gere os métodos getter / setter da variável de membro. Você pode definir as permissões de acesso e se o carregamento lento, etc.

@ToString: atua na classe, sobrescreve o método toString () padrão, exibe certos campos por meio do atributo of e exclui certos campos por meio do atributo exclude.

@EqualsAndHashCode: Atuando na classe, substituindo o igual padrão e hashCode

@NonNull: Principalmente usado em variáveis ​​de membro e parâmetros.O identificador não pode ser nulo, caso contrário, uma exceção de ponteiro nulo será lançada.

@NoArgsConstructor, @RequiredArgsConstructor,
@AllArgsConstructor: Atua na classe para gerar construtores. Existem staticName, access e outros atributos.

Depois que o atributo staticName for definido, uma instância será gerada usando um método estático, e o atributo access pode limitar as permissões de acesso.

@NoArgsConstructor: Gera um construtor sem argumento;

@RequiredArgsConstructor: Um construtor que gera variáveis ​​de membro com anotações finais e @NonNull;

@AllArgsConstructor: Gere o construtor de parâmetro completo

@Data: Atua na classe, é uma coleção das seguintes anotações: @ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor

@Builder: Atuando na classe, transformando a classe em um modo construtor

@Log: atua na classe para gerar variáveis ​​de log. Existem diferentes anotações para diferentes produtos de implementação de log:

package com.kaplan.pojo;

import lombok.*;

import lombok.extern.log4j.Log4j;
//默认生成的方法是 public 的,如果要修改方法修饰符可以设置 AccessLevel 的值
@ToString(of = {
    
    "name","age"},exclude = {
    
    "age"})
@Getter(access = AccessLevel.PROTECTED)
@Setter(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class TestDemo {
    
    

@NonNull
private String name;
private int age ;
private String email;
private String address; 

@Getter
@Setter 
private String dob;
}

O texto acima é apenas uma introdução às anotações comuns da classe POJO. As anotações do Lombok incluem, mas não se limitam a elas. Há muitas anotações que não são apresentadas aqui. Se você estiver interessado, pode aprender em particular.

Dois, FindBugs

Conforme o projeto fica maior e maior, o tempo está ficando cada vez mais longo e o trabalho de revisão de código é um fardo enorme. Nosso código JAVA diário é verificado pelo FindBugs antes de ser enviado ao SVN. Então, o que exatamente é FindBugs? FindBugs é uma ferramenta de análise estática que examina classes ou arquivos JAR e compara bytecode com um conjunto de padrões de defeito para encontrar problemas. Findbugs vem com detectores, incluindo mais de 60 tipos de
práticas inadequadas , mais de 80 tipos de correção, 1 tipo de internacionalização, 12 tipos de
vulnerabilidade de código malicioso , 27 tipos de
correção multithread , 23 tipos de desempenho e 43 tipos de duvidoso. Existem configurações personalizadas: podemos configurar as regras de inspeção nós mesmos (o que fazer e o que não fazer) ou podemos implementar nossas próprias regras de verificação exclusivas (modos de bug específicos definidos pelo usuário precisam herdar sua interface , Escreva sua própria classe de verificação, que é uma técnica avançada). FindBugs verifica o bytecode java, que é um arquivo * .class.

1. A necessidade da inspeção do código
Em outras palavras, por que precisamos da inspeção do código? Embora não haja nenhum erro gramatical em um determinado método de escrita de código, pode haver erros, como possíveis bugs, como bloqueio de thread, etc., esta é a lista de erros a ser verificada, a verificação estática pode ser operada:

1.1 Passo a passo do código: (O método adotado pela empresa anterior) os  
programadores podem extrair o código para o passo a passo em um determinado intervalo de tempo.

De acordo com o relatório de resumo durante a explicação passo a passo, essas experiências serão compiladas em uma lista como base para o próximo passo a passo do código.

As características desse método são manual, discussão com várias pessoas e operação simples, mas a eficiência é relativamente baixa.
2.2 Leitura de código

Use um software para escanear nosso código para encontrar problemas potenciais. Existem muitas ferramentas comerciais disponíveis para digitalização, como Parasoft JTest, Software
Analyzer, pclint, Findbugs e outras ferramentas. A digitalização de software é caracterizada por digitalização de máquina e alta eficiência, mas não é flexível o suficiente e não conduz à expansão.

2. Instalação do FindBugs

2.1 FindBugs de instalação IDEA

(1) Instalação online: Menu Arquivo-> Configurações-> Plugins-> Navegar nos
repositórios ...-> Pesquisar FindBugs na caixa de pesquisa- > Obter o resultado FindBugs-IDEA, baixar (instalar) e reiniciá-lo.

(2) Instalação offline: primeiro baixe o pacote compactado FindBugs, baixe o URL: pacote compactado FindBugs, em seguida, menu Arquivo-> Configurações-> Plug-ins-> Instalar
plug do disco-> selecione o pacote compactado FindBugs que você baixou (porque contém mais pacotes jar) Muitos), em seguida, aplique-> OK, reiniciar está ok.

2.2 Eclipse install FindBugs

(1) 在线 安装 :
eclipse : Ajuda-> Instalar Novo
Software-> Adicionar-> Nome : findbugs, Localização : http: //findbugs.cs.umd.edu/eclipse

Em seguida, clique em OK, selecione FindBugs, então você pode ir para Concluir até o fim, reiniciar o eclipse, selecionar qualquer item, clicar com o botão direito do mouse, se findbugs aparecer na caixa pop-up, significa que a instalação foi bem-sucedida ou abra eclipse-> janela-> Preferências, pesquise por palavras-chave findbugs, se o item de configuração puder ser encontrado, a instalação foi bem-sucedida.

(2) Instalação offline:

Primeiro você precisa baixar o pacote compactado de FindBugs que você aplica: URL de download: FindBugs para eclipse, em seguida, abra o diretório de instalação do eclipse, encontre dropins ou plug-ins (qualquer um), coloque o pacote compactado neste diretório e, em seguida, inicie o eclipse , Selecione qualquer item, clique com o botão direito do mouse, se findbugs aparecer na caixa pop-up, a instalação foi bem-sucedida ou abra eclipse-> janela-> Preferências, pesquise a palavra-chave findbugs, se você encontrar o item de configuração, a instalação foi bem-sucedida.

(3) Se não houver nenhum Bug
Explorer após clicar em Find Bugs-> Find Bugs , então Window-> ShowView-> Other-> FindBugs-> Bug Explorer. Os bugs encontrados têm 3 cores: o
símbolo de bug preto é classificado, o bug vermelho indica que o código deve ser modificado depois que um bug sério é encontrado e o bug laranja indica um bug de aviso em potencial.

3. Use FindBugs no IDEA

Selecione o projeto, pacote, classe, clique com o botão direito do mouse, selecione FindBugs, Analyze Selected File (s) single file, Analyze Package (s) Files package, Analyze Module Files inteiro, Analyze Project Files inteiro do projeto

4. Alguns erros comuns: os seguintes são copiados e modificados por outras pessoas, para a conveniência de aprender sozinho no futuro, por favor, me perdoe

4.1 A má prática consiste principalmente em alguns hábitos ruins no código. Os
nomes das classes devem começar com uma letra maiúscula não são usados ​​de acordo com a especificação Java. Os nomes das classes devem começar com uma letra maiúscula. Os
nomes dos métodos devem começar com uma letra minúscula. Os nomes dos métodos devem começar com uma letra minúscula. começando com uma letra
nomes de campo devem começar com letras minúsculas letras minúsculas nome da letra de campo
método equals () não verifica iguais argumento nulo () método deve examinar os não-vazias
iguais define classe () e usa Object.hashCode () cobre uma classe O método equals é escrito, o método hashCode não é sobrescrito e o método hashCode do objeto Object é usado. O
método ignora o valor de retorno excepcional. O
método Equals não deve assumir nada sobre o tipo de seu argumento igual (Object o) O tipo de parâmetro o faz suposições. Compare este objeto com o objeto especificado. O resultado é verdadeiro se e somente se o parâmetro não for nulo e for um objeto que representa o mesmo tipo deste objeto.
Comparação de objetos String usando == ou! = Use == ou! = Para comparar objetos do tipo String, o
Método pode ignorar a exceção O método pode ignorar a exceção
Método invoca System.exit () Chama a instrução System.exit (…) no método, considere o uso de RuntimeException em vez de
Método ignora o resultado de InputStream.read () O método InputStream.read ignora vários caracteres retornados, se o resultado não for verificado A situação em que o usuário solicita a leitura de alguns caracteres não pode ser tratada corretamente.

4.2 Código duvidoso Código incorreto (geralmente o código não é escrito de acordo com a especificação Java, ou a instrução está incompleta, conversão de tipo, instrução redundante, julgamento)
Instrução switch encontrada onde o caso padrão está faltando O switch não possui instrução case que é executada por padrão
Instrução Switch encontrada onde um caso cai para o próximo caso A instrução Switch executa uma ramificação após executar a próxima ramificação. Normalmente, o caso é seguido por uma instrução break ou return para saltar.
Armazenamento morto na variável local Esta instrução atribui um valor a uma variável local, mas não há uso para isso no seguinte. Normalmente, isso indica um erro porque o valor nunca foi usado.
Gravar no campo estático do método de instância Na
verificação de nulo redundante de valor conhecido como não nulo, o valor não nulo é julgado como nulo no campo Gravar em estático do método de instância .
Método usa o mesmo código para duas ramificações Este método usa o mesmo código para duas ramificações. Verifique se isso não é um erro de codificação. A
exceção é capturada quando a exceção não é lançada. A exceção é capturada quando a exceção não é lançada no bloco try / catch, mas a exceção não é lançada na instrução try e RuntimeException não é capturado explicitamente
Resultado da divisão integral convertido em duplo ou A divisão de inteiro flutuante é forçada a ser convertida para o tipo duplo ou flutuante.
Possível desreferência de ponteiro nulo devido ao valor de retorno do método chamado O valor de retorno do método chamado é reatribuído sem verificar se ele é nulo, portanto, uma exceção de ponteiro nulo pode ocorrer.
Objeto inútil criado Objeto criado e não usado
Campo público / protegido não lido Campo não usado

4.3 Internacionalização
Considere o uso da versão parametrizada Locale do método invocado em aspectos relacionados à internacionalização
do código.Use o formato de codificação padrão da plataforma para converter a string para maiúsculas e minúsculas, o que pode levar à conversão inadequada de caracteres internacionais. Use o seguinte método para converter caracteres

Aspectos relacionados 4.4 Desempenho desempenho em relação código (principalmente atributos inúteis são declarados)
Boxe / unboxing para analisar a conversão de tipo primitivo, tais como a conversão string para int, deve usar Integer.parseInt ( "") em vez de Integer.valueOf ( "")
Método concatena string usando + in aloop
Cada vez que string + conexão no loop, um novo objeto string será gerado. Em Java, o custo de criar um novo objeto é muito caro, especialmente na instrução de loop, a
solução é ineficiente : Use StringBuffer ou StringBuilder para reutilizar objetos.
O método privado nunca é chamado A
coleta de lixo explícita não é chamada ; extremamente duvidosa, exceto no código de benchmarking,
chama explicitamente a nomenclatura da coleta de lixo no código, o que não funciona. No passado, alguém chamava o método de coleta de lixo na operação de fechamento ou método finalize, o que causava uma grande perda de desempenho. Essa reciclagem em grande escala de objetos fará com que o processador funcione lentamente.
Campo não lido: este campo deve ser estático? O campo não lido
deve ser uma classe interna estática deve ser uma classe interna estática

4.5 O
método experimental pode não conseguir limpar o fluxo ou recurso na exceção verificada
Este método pode não ser capaz de limpar (fechar, descartar) um fluxo, objeto de banco de dados ou outro recurso. Uma ação de limpeza clara é necessária.
Solução: O fechamento do fluxo é finalmente escrito dentro

4.6 Vulnerabilidade de código malicioso Com relação à vulnerabilidade de código malicioso (principalmente alguns atributos, é recomendado mudar para privado e fornecer métodos get, set para ele)
Pode expor a representação interna incorporando referência a objeto mutável
Este código armazena a referência de objeto mutável externo para A representação interna do objeto. Se a instância for acessada por um código não confiável e alterações não verificadas, colocarão em risco a segurança do objeto e de atributos importantes. Armazenar uma cópia de um objeto é a melhor maneira em muitos casos.
O campo não é final, mas deve ser final O
campo não é final e não pode ser protegido de código malicioso Antes deste campo deve ser final O
campo deve ser protegido por pacote
Um campo estático pode ser um código malicioso ou outro Modificação de acesso ao pacote. Você pode declarar esse tipo de campo como final para evitar esse erro.

4.7 Correção multithreaded
Static DateFormat DateFormat relacionado à correção do código é inerentemente inseguro em vários threads.Se uma instância de DateFormat for compartilhada no intervalo de thread sem usar um método sincronizado, alguns comportamentos estranhos ocorrerão no aplicativo. .
Chamada para DateFormat estático DateFormats não é seguro para usar habilidades multi-threaded, método de melhoria: precisa criar várias instâncias ou sincronização de thread

4.8 Correção
Nullcheck do valor previamente desreferenciado em relação à exatidão do código Este código abandonou anteriormente a verificação do valor nulo. Solução Execute uma verificação nula.
Possível anulação de referência de ponteiro nulo pode ser nula.
Objeto de anulação de referência de ponteiro nulo não foi reatribuído após ter sido atribuído um valor nulo.
Possível anulação de referência de ponteiro nulo no método no caminho de exceção. No método de anormal valor nulo processamento de chamada de branch, pode haver anulação de referência de objeto O
valor da operação é nulo e tem a garantia de ser desreferenciado no ramo de exceção do caminho de exceção, há um método para se referir a um objeto nulo, o que causa uma exceção de ponteiro nulo.
O método de Auto comparação de valor consigo mesmo executa uma operação de comparação em uma variável local e pode explicar erros ou erros de lógica. Por favor, certifique-se de que você está mais correto.

Um aparente loop recursivo infinito causará um estouro de pilha.

Três, PageHelpher

Ao usar java Spring para desenvolver, Mybatis pode ser considerado uma ferramenta poderosa para operações de banco de dados. Mas, quando lidamos com paginação, estamos acostumados a usar limite para paginação e o custo é relativamente alto. A paginação física do PageHelper (clique em mim no site oficial ) é mais conveniente para paginação de tabela única ou paginação de conjunto de resultados geral.

1. Apresente a dependência Maven do PageHelper

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.10</version>
</dependency>

2. Configure o arquivo applicationContext.xml
para adicionar um atributo interceptor de paginação ao bean de sqlsessionfactory de spring

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="plugins">
		<array>
			<bean class="com.github.pagehelper.PageInterceptor">
				<property name="properties">
					<value>
						<!-- 这里设定你的数据库类型 -->
						helperDialect = mysql
					</value>
				</property>
			</bean>
		</array>
	</property>
</bean>

3. Chame o método PageHelper

No método de serviço, chame o método estático startPage de PageHelper (observe que este método deve ser chamado antes da consulta real), passe o número da página pageNum a ser consultada e o número de itens exibidos por página pageSize e retorne o objeto PageInfo fornecido pelo plug-in PageHelper. Você pode completar automaticamente a paginação física do banco de dados sem adicionar manualmente uma cláusula de limite à instrução sql

@Override
public PageInfo<Student> testPage(Integer pageNum, Integer pageSize) {
    
    
	PageHelper.startPage(pageNum,pageSize);
	List<Student> studentList = studentMapper.selectAll();

	PageInfo pageInfo = new PageInfo(studentList);
	return pageInfo;
}

4. O problema de eficiência causado pela grande quantidade de dados do PageHelper

No processo de desenvolvimento, inevitavelmente usamos paginação.Normalmente, o plug-in PageHelper é muito conveniente para paginação, mas quando o volume de dados do projeto é grande, a velocidade de consulta do plug-in de paginação será lenta. . Uma comparação posterior descobriu que o SQL é ineficiente devido ao deslocamento do limite

O SQL originalmente escrito era assim:

select * from school where age >= 18;

A execução final é assim:

select * from (select * from school where age >= 18)where limit 100,10;

A explicação oficial de supportMethodsArguments é a seguinte:

  1. supportMethodsArguments: Suporte para passar parâmetros de paginação por meio de parâmetros da interface do Mapeador, o valor padrão é false, o plug-in de paginação selecionará automaticamente o valor do valor do parâmetro do método de consulta de acordo com o campo configurado pelos parâmetros acima, e paginar automaticamente quando encontrar um valor adequado. Para o método de uso, consulte ArgumentsMapTest e ArgumentsObjTest no pacote com.github.pagehelper.test.basic no código de teste.
  2. params: para suportar o método startPage (Object params), este parâmetro é adicionado para configurar o mapeamento de parâmetro, que é usado para obter o valor do objeto de acordo com o nome do atributo. Você pode configurar
    pageNum, pageSize, count, pageSizeZero, razoável e usar o valor padrão se o mapeamento não estiver configurado , O valor padrão é pageNum = pageNum; pageSize = pageSize; count = countSql; razoável = razoável; pageSizeZero = pageSizeZero.

O que isso significa? Ao usar o plug-in pageHelper, contanto que os parâmetros passados ​​ao Mapper incluam pageNum e pageSize, ele anexará automaticamente countSql para processamento de paginação. ** Em outras palavras, ele interceptará a instrução sql que escrevemos, reempacotará por si mesma e adicionará um limite atrás. ** É claro que isso não é problema quando a quantidade de dados é pequena, mas uma vez que a quantidade de dados é muito grande, o deslocamento de limti inevitavelmente aumentará ao paginar para os dados subsequentes. Inevitavelmente, o tempo de consulta será um múltiplo geométrico aumentar.

Solução

Cenário 1: modifique a configuração

Verificou a configuração do pageHelper e descobriu que a configuração é a seguinte

pagehelper:
	 helperDialect: mysql
	 reasonable: true
	 supportMethodsArguments: true  ###注意这一条

A maneira mais fácil é definir o atributo supportMethodsArguments como false, a segunda maneira é modificar a interface

public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {
    
     
	return startPage(pageNum, pageSize, count, null, null); 
}

Cancele o comentário anterior e reescreva-o como

PageHelper.startPage(query.getPageNum(),query.getPageSize(),false);

Esquema 2: Modifique a declaração de contagem

A API de consulta descobriu que o PageHelper realmente suporta a detecção automática de declarações de contagem.

Adicionar suporte de consulta de contagem manuscrita.
Adicionar parâmetro de configuração de sufixo de consulta de contagem countSuffix. Este parâmetro é configurado para PageInterceptor e o valor padrão é _COUNT. O plug-in de paginação encontrará primeiro a consulta de paginação manuscrita por meio do msId + countSuffix da consulta atual. Se existir, use a consulta de contagem manuscrita; se ela não existir, use o método anterior para criar automaticamente a consulta de contagem.

O que isso significa? Por exemplo, sua interface de consulta de paginação é denominada getAllUser, desde que você nomeie a instrução de contagem que escreveu getAllUser_COUNT, o PageHelper usará a instrução de contagem escrita por nós mesmos e não será mais gerada automaticamente.

 <select id="getAllUser_COUNT" resultType="Long">

 select max(id) from student
 </select>

Cenário 3: modificar o mecanismo de mesa

Modifique o mecanismo da tabela diretamente.Se o padrão for InnoDB, porque o mecanismo não salva o número específico de linhas na tabela, as estatísticas serão basicamente mais de 1 segundo após o volume de dados atingir um milhão;

Modificado para MyISAM; mas no caso de consulta de paginação, a consulta de registro após 1 milhão será muito lenta;

Quatro, Regex Util

Regex Util é um plug-in de teste de expressão regular, que pode destacar a sintaxe da expressão regular, correspondência de colchetes e detecção de erros. Ser capaz de lembrar a descrição detalhada da função de expressão regular.

Site oficial: http://myregexp.com/eclipsePlugin.html
URL de instalação online do Eclipse: http://regexutil.sourceforge.net/update/

Os principais plug-ins usados ​​atualmente pelo host são estes e serão adicionados no futuro. Bem-vindos a todos para fazerem perguntas para aprender uns com os outros ~

Acho que você gosta

Origin blog.csdn.net/weixin_42777004/article/details/108646543
Recomendado
Clasificación