índice
Artigo 38 Verificar a validade dos parâmetros
Artigo 39 Cópia protetora quando necessário
Artigo 40 Projete assinaturas de método com cuidado
Artigo 41 Use sobrecargas com cuidado
Artigo 42 Use parâmetros variáveis com cuidado
O Artigo 43 retorna uma matriz ou coleção de comprimento zero, não nula
Artigo 44 Escreva notas de documentação para todos os elementos de API exportados
Foco: Usabilidade, robustez, flexibilidade
Artigo 38 Verificar a validade dos parâmetros
Ao escrever métodos ou construtores, você deve considerar as limitações dos parâmetros e verificar explicitamente
Artigo 39 Cópia protetora quando necessário
Se a classe possui componentes mutáveis obtidos do cliente ou devolvidos ao cliente, a fim de manter a imutabilidade, uma cópia de proteção é feita quando necessário.
Caso contrário, é declarado no documento que este componente não pode ser modificado.
Por exemplo:
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;
}
}
O período representa um período de tempo imutável.
No entanto, o período não é imutável! ! ! Porque a data é variável.
Date start = new Date();
Date end = new Date();
Period p = new Period(strat, end);
end.setYear(78);//因为Date是可变的,导致p被修改了
Solução:
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);
}
}
O período ainda pode ser alterado.
Date start = new Date();
Date end = new Date();
Period p = new Period(strat, end);
p.end().setYear(78);//因为Date是可变的,导致p被修改了
Solução:
public Date start() {
return new Date(start.getTime());
}
public Date end() {
return new Date(end.getTime());
}
Artigo 40 Projete assinaturas de método com cuidado
1. Evite longas listas de parâmetros. 4 parâmetros ou menos.
Não defina longas sequências de parâmetros do mesmo tipo, é fácil confundir acidentalmente a ordem dos parâmetros.
Como encurtar a longa lista de parâmetros?
1) Dividir em vários métodos
2) Crie uma classe auxiliar para salvar o agrupamento de parâmetros.
3) Adote o modo Builder. Este método é especialmente útil quando o método possui vários parâmetros e alguns deles são opcionais!
2. Para tipos de parâmetros, as interfaces são preferíveis às classes.
3. Para o tipo booleano, o tipo de enumeração de dois elementos é preferido
Artigo 41 Use sobrecargas com cuidado
Por que usar a sobrecarga com cuidado?
Porque em circunstâncias especiais (conversão de tipo, boxing e unboxing automáticos, etc.), é difícil determinar qual método sobrecarregado será chamado.
Sugira
1) Para métodos múltiplos com o mesmo número de parâmetros, a sobrecarga deve ser evitada tanto quanto possível.
2) Para evitar esta situação: o mesmo conjunto de parâmetros pode ser passado para diferentes métodos sobrecarregados somente após a conversão do tipo.
举例 : m (Lista <?> S) , m (Definir <?> S) , m (Coleção <?> S)。
Artigo 42 Use parâmetros variáveis com cuidado
Quando o desempenho é importante, use parâmetros variáveis com cuidado. Cada chamada de um parâmetro variável resultará em uma alocação e inicialização de array.
Como melhorar? Quando for determinado que 95% das chamadas têm 3 ou menos parâmetros, defina 5 métodos sobrecarregados.
m ()
m (int a)
m (int a, int b)
m (int a, int b, int c)
m (int a, int b, int c, int .... resto)
O Artigo 43 retorna uma matriz ou coleção de comprimento zero, não nula
Para métodos cujo tipo de retorno é uma matriz ou coleção, ele retorna uma matriz ou coleção de comprimento zero em vez de retornar nulo.