Dicas/sugestões sobre essa validação de models

Eae galera!

Estou desenvolvendo um módulo de validação em uma aplicaçao e gostaria da opinião de vcs a respeito da mesma:

Todas as classes que tem a responsabilidade de efetuar uma validação em qualquer objeto, deve implementar essa interface:

/**
 * Interface usada para fazer efetuar as validacoes em objetos gerais.
 * @author Danilo Barsotti
 */
public interface ValidationBase{

	public boolean isValid();
	
	public List<String> getMessages();
	
}

Exemplo de uma classe que implementa a interface acima:

public class UserValidationTest implements ValidationBase{

	private UserModelMock userModel;
	
	public UserValidationTest(UserModelMock userModel){
		this.userModel = userModel;
	}
	
	@Override
	public List<String> getMessages() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean isValid() {
		if(!"".equals(userModel.getNome())){
			return true;
		}else{
			return false;
		}
	}

}

Os models que necessitam de validações devem estender essa classe:

/**
 * Todos os models que necessitarem de validacao deverao estender
 * dessa classe.
 * 
 * @author Danilo Barsotti
 *
 */
public abstract class ModelValidatedBase extends ModelBase{

	private ValidationBase validation = getValidationBase();
	
	public abstract ValidationBase getValidationBase();
	
	public boolean isValid(){
		return validation.isValid();
	}
	
	public List<String> getMessages(){
		return validation.getMessages();
	}
	
}

Um exemplo de model que estende a classe acima:

public class UserModelMock extends ModelValidatedBase{

	private String nome;
	
	
	@Override
	public ValidationBase getValidationBase() {
		return new UserValidationTest(this);
	}


	public String getNome() {
		return nome;
	}


	public void setNome(String nome) {
		this.nome = nome;
	}
}

E o uso de tudo isso ficaria assim ( para se efetuar a validação do model ):
( o teste ficou ridiculo pois ainda estou desenvolvendo. 8) )

public class ValidationTest extends TestCase{

	public void testValidation() throws Exception{
		UserModelMock user = new UserModelMock();
		user.setNome("Danilo");
		assertEquals(true, user.isValid());
	}
	
	public static void main(String args[]) throws Exception{
		ValidationTest val = new ValidationTest();
		val.testValidation();
	}
}

A idéia é facilitar a programação das validações dos models, deixando a responsabilidade para o proprio model de efetuar sua validação ( até a validação não sair do dominio da mesma ).

Oque vcs acham disso?
ficaria melhor se eu injetar na ModelValidatedBase o ValidationBase usando Spring?
Alguma dica/critica/sugestão??

Obrigado a todos!!!

Eu uso uma forma bem parecida de validacao, na maioria dos casos pra ser utilizada na hora de persistir o objeto. Antes de passar para a camada de persistencia é feita a validação.

A unica advertencia que eu faria no seu caso é de nao herdar de uma classe padrao. Talvez seja melhor o proprio objeto implementar a interface.

Opaa!! legal vc ter respondido!!

vc poderia explicar o motivo de nao herdar? um caso de uso.

valeu hein!!

Sempre que vc herda de uma classe vc faz um forte acoplamento com essa classe da qual herdou. Em algum ponto, e nesse caso é bastante previsivel, alguma das duas implementacoes pode precisar de uma mudanca radical. Nesse momento vc terá problemas em toda a hierarquia.

Apenas implementando uma interface vc obtem os mesmos beneficios sem se prender a implementacao de uma classe pai. Principalmente nesse exemplo onde nem aproveitamento de código haverá. (Mesmo se houvesse, seria melhor uma composicao e nao a heranca).

A principio, nunca use heranca. Voce encontrará casos em que precisara dela, mas fuja sempre que possivel.