package br.com.caelum.stella.tinytype;
import br.com.caelum.stella.format.CPFFormatter;
import br.com.caelum.stella.validation.CPFValidator;
/**
* Representa um Cadastro de Pessoas Física - CPF.
*
* @author leobessa
*/
public final class CPF {
/**
* Número do CPF. Possui apenas os caracteres numéricos.
*/
private final String numero;
/**
* Número do CPF. No formato ddd.ddd.ddd-dd .
*/
private final String numeroFormatado;
/**
* Constrói um CPF com o número especificado. Se o número contiver
* apenas caracteres numéricos ou estiver no formato ddd.ddd.ddd-dd,
* ele é guardado com e sem formatação nos respectivos atributos.
* Caso contrário, ele guarda o parâmetro como passado em ambos os atributos.
*
* @param numero número do CPF
*/
public CPF(String numero) {
CPFFormatter formatador = new CPFFormatter();
if (formatador.isFormatted(numero)) {
this.numero = formatador.unformat(numero);
this.numeroFormatado = numero;
} else if (formatador.canBeFormatted(numero)) {
this.numero = numero;
this.numeroFormatado = formatador.format(numero);
} else {
this.numero = this.numeroFormatado = numero;
}
}
/**
* Retorna o número do CPF apenas com os caracteres numéricos.
*
* @return número do CPF.
*/
public String getNumero() {
return numero;
}
/**
* Retorna o número do CPF no formato ddd.ddd.ddd-dd .
*
* @return número do CPF no formato ddd.ddd.ddd-dd .
*/
public String getNumeroFormatado() {
return numeroFormatado;
}
/**
* Retorna se o número do CPF é válido. O resultado é <code>true</code>
* se os dígitos verificadores estão de acordo com a regra de cálculo.
*
* @return se o número do CPF é valido.
*
* @see CPFValidator
*/
public boolean isValido() {
return new CPFValidator().invalidMessagesFor(numero).isEmpty();
}
/**
* Retorna uma representação em string desse CPF. A intenção desse método
* é ser usado para impressão e retorna o número no formato ddd.ddd.ddd-dd .
*
* @return número do CPF no formato ddd.ddd.ddd-dd.
*/
@Override
public String toString() {
return getNumeroFormatado();
}
/**
* Retorna um hash code para esse CPF.
*
* @return um valor de hash code para esse objeto.
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((numero == null) ? 0 : numero.hashCode());
return result;
}
/**
* Compara esse <code>CPF</code> ao <code>Object</code>
* especificado. O resultado é <code>true</code> se e só se
* o argumento é um objeto <code>CPF</code> com o mesmo número.
*
* @param obj o objeto a ser comparado
* @return <code>true</code> se esse objeto é igual a <code>obj</code>;
* <code>false</code> caso contrário.
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final CPF other = (CPF) obj;
if (numero == null) {
if (other.numero != null) {
return false;
}
} else if (!numero.equals(other.numero)) {
return false;
}
return true;
}
}