Boa tarde,
Eu comecei a aprender Java há pouco tempo (questão de meses) e, por estar fazendo um projeto WEB protótipo, comecei a aprender como poderia captar de maneira “elegante” (como se diz na Caelum) certas exceções, como se um atributo é nulo (eu sei que já existe NullPointerException
!) e se seu tamanho é maior que um limite, etc, por questões de posterior persistência no banco (Pelo que entendi, isso tem a ver com a persistência… corrijam caso estiver errado, por favor).
Criei algumas classes testes inventando uma anotação NotNull
e uma exceção NotNullException
. Além disso, criei uma classe básica Cliente
, com só o atributo Nome
e seus getters
e setters
.
Estão aqui :
Classe Cliente
:
public class Cliente {
@NotNull
private String nome;
@NotNull
public String getNome() {
return this.nome;
}
private void setNome(String x) {
this.nome = x;
}
public Cliente(String x) {
this.setNome(x);
}
}
Annotation NotNull
:
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface NotNull {
}
Exception NotNullException
:
public class NotNullException extends RuntimeException {
private static final long serialVersionUID = 123L;
public NotNullException(Object o)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
super("O valor não pode ser nulo!");
this.naoNulo(o);
}
private void naoNulo(Object o) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Method[] m = o.getClass().getDeclaredMethods();
for (Method x : m) {
if (x.isAnnotationPresent(NotNull.class)) {
if (x.invoke(o).toString().length() < 1) {
throw this;
}
}
}
}
}
Funcionou no método main
:
public static void main(String[] args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Cliente c = new Cliente("");
new NotNullException(c);
}
Mas eu achei esse código meio estranho, pois :
A Annotation é vazia assim mesmo? (Eu sei que dá para por argumentos,etc nela, mas funcionou sem nada);
O jeito que eu invoco a verificação da Exception está “formalmente correto”?
Enfim, sou bem novato nisso, e pode ser que falte conhecimento, principalmente teórico (sobre metadados etc), e por isso a construção pode ter saído “não elegante”.