Tabla de contenido
Artículo 38 Verificar la validez de los parámetros
Artículo 39 Copia de protección cuando sea necesario
Artículo 40 Diseñar cuidadosamente las firmas de métodos
Artículo 41 Utilice las sobrecargas con precaución
Artículo 42 Utilice los parámetros variables con precaución
El artículo 43 devuelve una matriz o colección de longitud cero, no nula
Artículo 44 Escribir notas de documentación para todos los elementos API exportados
Enfoque: usabilidad, robustez, flexibilidad
Artículo 38 Verificar la validez de los parámetros
Al escribir métodos o constructores, debe considerar las limitaciones de los parámetros y verificar explícitamente
Artículo 39 Copia de protección cuando sea necesario
Si la clase tiene componentes mutables obtenidos del cliente o devueltos al cliente, para mantener la inmutabilidad, se realiza una copia protectora cuando es necesario.
De lo contrario, se indica en el documento que este componente no se puede modificar.
Por ejemplo:
public final class Period {
private final Date start;
private final Date end;
public Period(Date start, Date end) {
if (start.compareTo(end) > 0) {
throw new IllegalArgumentException(strat + "after" + end);
}
this.start = start;
this.end = end;
}
public Date start() {
return start;
}
public Date end() {
return end;
}
}
El período representa un período de tiempo inmutable.
¡Sin embargo, Period no es inmutable! ! ! Porque la fecha es variable.
Date start = new Date();
Date end = new Date();
Period p = new Period(strat, end);
end.setYear(78);//因为Date是可变的,导致p被修改了
Solución:
public Period(Date start, Date end) {
//先进行保护性拷贝,然后再对拷贝后的进行检查
this.start = new Date(start.getTime()); //使用保护性拷贝
this.end = new Date(end.getTime()); //使用保护性拷贝
if (this.start.compareTo(this.end) > 0) {
throw new IllegalArgumentException(strat + "after" + end);
}
}
El período aún se puede cambiar.
Date start = new Date();
Date end = new Date();
Period p = new Period(strat, end);
p.end().setYear(78);//因为Date是可变的,导致p被修改了
Solución:
public Date start() {
return new Date(start.getTime());
}
public Date end() {
return new Date(end.getTime());
}
Artículo 40 Diseñar cuidadosamente las firmas de métodos
1. Evite listas de parámetros largas. 4 parámetros o menos.
No defina largas secuencias de parámetros del mismo tipo, es fácil confundir accidentalmente el orden de los parámetros.
¿Cómo acortar la larga lista de parámetros?
1) Dividir en varios métodos
2) Cree una clase auxiliar para guardar la agrupación de parámetros.
3) Adopta el modo Constructor. Este método es especialmente útil cuando el método tiene varios parámetros, ¡y algunos de ellos son opcionales!
2. Para los tipos de parámetros, se prefieren las interfaces a las clases.
3. Para el tipo booleano, se prefiere el tipo de enumeración de dos elementos.
Artículo 41 Utilice las sobrecargas con precaución
¿Por qué utilizar la sobrecarga con precaución?
Porque en circunstancias especiales (conversión de tipo, empaquetado y desempaquetado automático, etc.), es difícil determinar qué método sobrecargado se llamará.
Sugerir
1) Para varios métodos con el mismo número de parámetros, se debe evitar la sobrecarga tanto como sea posible.
2) Para evitar esta situación: el mismo conjunto de parámetros se puede pasar a diferentes métodos sobrecargados solo después de la conversión de tipos.
举例 : m (Lista <?> S) , m (Establecer <?> S) , m (Colección <?> S)。
Artículo 42 Utilice los parámetros variables con precaución
Cuando el rendimiento es importante, utilice los parámetros variables con cuidado. Cada llamada de un parámetro variable dará como resultado una asignación e inicialización de una matriz.
¿Cómo mejorar? Cuando se determina que el 95% de las llamadas tienen 3 o menos parámetros, defina 5 métodos sobrecargados.
metro()
m (int a)
m (int a, int b)
m (int a, int b, int c)
m (int a, int b, int c, int .... resto)
El artículo 43 devuelve una matriz o colección de longitud cero, no nula
Para los métodos cuyo tipo de retorno es una matriz o colección, devuelve una matriz o colección de longitud cero en lugar de devolver un valor nulo.