¿Cómo escribir código para que el entrevistador pueda verlo? El jefe te enseña a comer.

Tabla de contenido

1. MyBatis no escribe 1 = 1 para múltiples condiciones de consulta

2. Itere el entrySet () para obtener la clave y el valor del mapa.

Tres, use Collection.isEmpty () para detectar vacío

Cuarto, intente especificar su tamaño al inicializar la colección.

Cinco, use StringBuilder para empalmar cadenas

6. Si necesita llamar al método Collection.contains con frecuencia, use Set

Siete, use bloques de código estático para realizar la asignación de variables miembro estáticas

8. Elimine las variables locales no utilizadas, los parámetros de métodos, los métodos privados, los campos y los paréntesis adicionales.

Nueve, constructor de escudos en clase de herramientas

Diez, elimine la captura de excepción redundante y agote


Después de trabajar unos meses, siento que mi código es muy irregular, con mucha redundancia y desordenado ¿Cómo puedo mejorar la especificación del código de una manera específica?

Compartamos una operación real del código estándar.

El código se puede escribir como 666, ¿puede el jefe aceptar discípulos?

1. MyBatis no escribe 1 = 1 para múltiples condiciones de consulta

Cuando se encuentran varias condiciones de consulta, el uso de donde 1 = 1 puede resolver fácilmente nuestro problema, pero es probable que esto cause una gran pérdida de rendimiento, porque después de agregar la condición de filtro de "donde 1 = 1", el sistema de base de datos Es imposible utilizar estrategias de optimización de consultas como índices. El sistema de base de datos se verá obligado a escanear cada fila de datos (es decir, escanear la tabla completa) para comparar si esta fila cumple con las condiciones del filtro. Cuando la cantidad de datos en la tabla es grande, la velocidad de la consulta será muy lenta Además, existirá el riesgo de inyección SQL.

Contramedida:

<select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo" resultType="java.lang.Integer">
 select count(*) from t_rule_BookInfo t where 1=1
<if test="title !=null and title !='' ">
 AND title = #{title} 
</if> 
<if test="author !=null and author !='' ">
 AND author = #{author}
</if> 
</select>

Ejemplo normal:

<select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo" resultType="java.lang.Integer">
 select count(*) from t_rule_BookInfo t
<where>
<if test="title !=null and title !='' ">
 title = #{title} 
</if>
<if test="author !=null and author !='' "> 
 AND author = #{author}
</if>
</where> 
</select>

Lo mismo es cierto para la operación UPDATE, puede usar una bandera en lugar de 1 = 1.

2. Itere el entrySet () para obtener la clave y el valor del mapa.

Cuando solo se necesita obtener la clave de clave principal del mapa en el ciclo, iterar keySet () es correcto; sin embargo, cuando se necesitan la clave de clave principal y el valor del valor, iterar entrySet () es más eficiente que iterar keySet () primero. Es mejor obtener el valor más tarde.

Contramedida:

//Map 获取value 反例:
HashMap<String, String> map = new HashMap<>();
for (String key : map.keySet()){
    String value = map.get(key);
}

Ejemplo normal:

//Map 获取key & value 正例:
HashMap<String, String> map = new HashMap<>();
for (Map.Entry<String,String> entry : map.entrySet()){
 String key = entry.getKey();
 String value = entry.getValue();
}

Tres, use Collection.isEmpty () para detectar vacío

Usar Collection.size () para detectar si está vacío lógicamente no es un problema, pero usar Collection.isEmpty () hace que el código sea más legible y puede lograr un mejor rendimiento; además, cualquier implementación de Collection.isEmpty () La complejidad del tiempo es O (1), y no es necesario recorrerlo varias veces, pero parte de la complejidad del tiempo lograda por el método Collection.size () puede ser O (n)

Contramedida:

LinkedList<Object> collection = new LinkedList<>();
if (collection.size() == 0){
 System.out.println("collection is empty.");
}

Ejemplo normal:

LinkedList<Object> collection = new LinkedList<>();
if (collection.isEmpty()){
    System.out.println("collection is empty.");
}

//检测是否为null 可以使用CollectionUtils.isEmpty()
if (CollectionUtils.isEmpty(collection)){
    System.out.println("collection is null.");

}

Cuarto, intente especificar su tamaño al inicializar la colección.

Intente especificar el tamaño de la colección durante la inicialización, lo que puede reducir efectivamente el número de expansiones de la colección, porque es probable que la complejidad temporal de cada expansión de la colección sea O (n), lo que consume tiempo y rendimiento.

Contramedida:

//初始化list,往list 中添加元素反例:
int[] arr = new int[]{1,2,3,4};
List<Integer> list = new ArrayList<>();
for (int i : arr){
 list.add(i);
}

Ejemplo normal:

//初始化list,往list 中添加元素正例:
int[] arr = new int[]{1,2,3,4};
//指定集合list 的容量大小
List<Integer> list = new ArrayList<>(arr.length);
for (int i : arr){
    list.add(i);
}

Cinco, use StringBuilder para empalmar cadenas

Java optimiza el empalme general de cadenas durante el tiempo de compilación, pero el empalme de cadenas en un bucle no se puede optimizar durante el tiempo de compilación de Java, por lo que es necesario utilizar StringBuilder como reemplazo.

Contramedida:

//在循环中拼接字符串反例
String str = "";
for (int i = 0; i < 10; i++){
    //在循环中字符串拼接Java 不会对其进行优化
    str += i;
}

Ejemplo normal:

//在循环中拼接字符串正例
String str1 = "Love";
String str2 = "Courage";
String strConcat = str1 + str2;  //Java 编译器会对该普通模式的字符串拼接进行优化
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++){
   //在循环中,Java 编译器无法进行优化,所以要手动使用StringBuilder
    sb.append(i);
}

6. Si necesita llamar al método Collection.contains con frecuencia, use Set

En la biblioteca de clases de colección de Java, la complejidad de tiempo general del método contains de List es O (n). Si el método contains necesita ser llamado con frecuencia en el código para encontrar datos, primero convierta la lista de colección en una implementación HashSet y la complejidad temporal de O (n) Será O (1).

Contramedida:

//频繁调用Collection.contains() 反例
List<Object> list = new ArrayList<>();
for (int i = 0; i <= Integer.MAX_VALUE; i++){
    //时间复杂度为O(n)
    if (list.contains(i))
    System.out.println("list contains "+ i);
}

Ejemplo normal:

//频繁调用Collection.contains() 正例
List<Object> list = new ArrayList<>();
Set<Object> set = new HashSet<>();
for (int i = 0; i <= Integer.MAX_VALUE; i++){
    //时间复杂度为O(1)
    if (set.contains(i)){
        System.out.println("list contains "+ i);
    }
}

Siete, use bloques de código estático para realizar la asignación de variables miembro estáticas

Para las variables miembro estáticas del tipo de colección, se debe usar la asignación de bloque de código estático en lugar de usar la implementación de la colección para asignar valores.

Contramedida:

//赋值静态成员变量反例
private static Map<String, Integer> map = new HashMap<String, Integer>(){
    {
        map.put("Leo",1);
        map.put("Family-loving",2);
        map.put("Cold on the out side passionate on the inside",3);
    }
};
private static List<String> list = new ArrayList<>(){
    {
        list.add("Sagittarius");
        list.add("Charming");
        list.add("Perfectionist");
    }
};

Ejemplo normal:

//赋值静态成员变量正例
private static Map<String, Integer> map = new HashMap<String, Integer>();
static {
    map.put("Leo",1);
    map.put("Family-loving",2);
    map.put("Cold on the out side passionate on the inside",3);
}

private static List<String> list = new ArrayList<>();
static {
    list.add("Sagittarius");
    list.add("Charming");
    list.add("Perfectionist");
}

8. Elimine las variables locales no utilizadas, los parámetros de métodos, los métodos privados, los campos y los paréntesis adicionales.

Nueve, constructor de escudos en clase de herramientas

La clase de utilidad es una colección de funciones y campos estáticos, que no se deben instanciar; sin embargo, Java agrega un constructor público implícito para cada clase sin un constructor claramente definido. Para evitar la instanciación innecesaria, debe Defina explícitamente un constructor privado para proteger este constructor público implícito.

Contramedida:

public class PasswordUtils {
//工具类构造函数反例
private static final Logger LOG = LoggerFactory.getLogger(PasswordUtils.class);

public static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndDES";

public static String encryptPassword(String aPassword) throws IOException {
    return new PasswordUtils(aPassword).encrypt();
}

Ejemplo normal:

public class PasswordUtils {
//工具类构造函数正例
private static final Logger LOG = LoggerFactory.getLogger(PasswordUtils.class);

//定义私有构造函数来屏蔽这个隐式公有构造函数
private PasswordUtils(){}

public static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndDES";

public static String encryptPassword(String aPassword) throws IOException {
    return new PasswordUtils(aPassword).encrypt();
}

Diez, elimine la captura de excepción redundante y agote

Después de capturar la excepción con la declaración catch, si no se procesa nada, simplemente deje que la excepción se vuelva a lanzar. Esto es lo mismo que no detectar la excepción. Puede eliminar este fragmento de código o agregar otro procesamiento.

Contramedida:

//多余异常反例
private static String fileReader(String fileName)throws IOException{

    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
        String line;
        StringBuilder builder = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
        return builder.toString();
    } catch (Exception e) {
        //仅仅是重复抛异常 未作任何处理
        throw e;
    }
}

Ejemplo normal:

//多余异常正例
private static String fileReader(String fileName)throws IOException{

    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
        String line;
        StringBuilder builder = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
        return builder.toString();
        //删除多余的抛异常,或增加其他处理:
        /*catch (Exception e) {
            return "fileReader exception";
        }*/
    }
}

El articulo termina aqui

Para que podamos escribir un código más estandarizado, Xiao Bian aquí para preparar un manual para todos el desarrollo de Alibaba, necesitamos pequeños amigos que puedan señalarme el punto que escojo libremente oh 

Si le gusta que el editor comparta, puede darle Me gusta y seguirlo. El editor seguirá compartiendo los últimos artículos y recibiendo beneficios para usted.

Supongo que te gusta

Origin blog.csdn.net/SQY0809/article/details/109361559
Recomendado
Clasificación