Como passar um Enum como parâmetro

4 respostas
java
P

Tenho duas classes que chamam seus respectivos Enum para realizar a validação dos parâmetros de entrada de um método.
Quero unificar essas duas classes em uma só, para isso pensei acrescentar o parâmetro de Enum especifico que quero
que seja acionado dentro da classe mas não conseguir fazer isso, alguma ideia de como fazer isso ?

public void metodoQualquer1 (Resource resource) {
		
		// Instância a Classe Validador.   
	    ValidateParameterUm validator = new ValidateParameterUm();
		
		// É criar uma variável do Enum que pretendo chamar na classe de Validador
	    ValidatorParameterUmEnum vParameterUm;
	    
		// Chama a Classe Validador passando o objeto e a variavel de Enum
		validator.UmValidator(resource);		
	   
	    
	    if (validator.isValid()) { 
			// Faça alguma coisa
		}
}

public void metodoQualquer2 (Resource resource) {
		
		// Instância a Classe Validador.   
	    ValidateParameterDois validator = new ValidateParameterDois();
		
		// É criar uma variável do Enum que pretendo chamar na classe de Validador
	    ValidatorParameterDoisEnum vParameterDois;
	    
		// Aqui a ideia é chamar a Classe Validador passando o objeto e a variavel de Enum
		validator.DoisValidator(resource, ParameterDois);		
	   
	    
	    if (validator.isValid()) { 
			// Faça alguma coisa
		}
}

// Dessa forma consigo unificar as duas classes Validate abaixo em uma só.
public class ValidateParameterUm {

	private final List<String> errors = new ArrayList<String>();
	
	// Aqui precisaria receber o Enum como parâmetro 
	public void UmValidator(Resource resource ) {
		
		// Aqui acionar o for com o enum recebido no parâmetro, dessa forma teria a Classe fléxivel podendo ser acionada
		// para validar enums diferentes.
		for(ValidatorParameterUmEnum validator : ValidatorParameterUmEnum.values() ) {
			if(!validator.validate(resource)) {
					errors.add(validator.errorMessage);
			}
		}
	}
	
	public boolean isValid() {
		return errors.isEmpty();
	}
	
	public Collection<String> getErrors() {
		return errors;
	}
	
}

public class ValidateParameterDois {

	private final List<String> errors = new ArrayList<String>();
	
	public void PathValidator(Resource resource ) {
			
		for(ValidatorParameterDoisEnum validator : ValidatorParameterDoisEnum.values() ) {
			if(!validator.validate(resource)) {
					errors.add(validator.errorMessage);
			}
		}
	}
	
	public boolean isValid() {
		return errors.isEmpty();
	}
	
	public Collection<String> getErrors() {
		return errors;
	}
	
}

// Enums de validação
public enum ValidatorParameterUmEnum {
	
	NOT_NULL_CAMPO1("Campo não pode ser null") {
		@Override
		public boolean validate(Resource resource) {
			return !resource.getName().isEmpty();
		}
	};
	
	public final String errorMessage;
	
	private ValidatorParameterPathEnum(String errorMessage) {
		this.errorMessage = errorMessage;
	}
	
	public abstract boolean validate(Resource resource );

}

public enum ValidatorParameterDoisEnum {
	
	NOT_NULL_CAMPO_ABC("Campo não pode ser null") {
		@Override
		public boolean validate(Resource resource) {
			return !resource.getTipo().isEmpty();
		}
	},
		NOT_NULL_CAMPO_XYZ("Campo não pode ser null") {
		@Override
		public boolean validate(Resource resource) {
			return !resource.getDescricao().isEmpty();
		}
	};
	
	public final String errorMessage;
	
	private ValidatorParameterPathEnum(String errorMessage) {
		this.errorMessage = errorMessage;
	}
	
	public abstract boolean validate(Resource resource );

}

4 Respostas

P

Cria uma interface que declare o método boolean validate (Resource resource) e que ambas as enum implementem. Assim o teu método do Validator recebe como argumento essa interface.

J

Dê nomes mais significativos pro objetivo do programa. Evite essa mistura, deixa cada validação separada, evitando impacto quando precisar dar manutenção em uma delas.

P

Pmlm obrigado pelo retorno, segui sua orientação mas ainda fiquei com dúvida de como atribuir o Enum no método validator já que esse método deverá acionar os diferentes Enum e portanto o Enum do for precisará ser genérico conforme o código abaixo:

Desde já obrigado.

public interface InterfaceParameterValidator {
	boolean validate(Resource resource);
}


public class ParameterValidate {

	private final List<String> errors = new ArrayList<String>();

	public void GenericValidator( Resource resource, Enum??? vParameterUm ) {
		
		// Como receber o Enum Genérico que será usado no for abaixo 
		for( GenericEnum validator : GenericEnum.values() ) {
			if(!validator.validate(resource)) {
					errors.add(validator.errorMessage);
			}
		}
	}
	
	public boolean isValid() {
		return errors.isEmpty();
	}
	
	public Collection<String> getErrors() {
		return errors;
	}
	
}



public void metodoQualquer1 (Resource resource) {
		
		// Instância a Classe Validador.   
	     ParameterValidate validator = new  ParameterValidate();
		
		// A ideia é criar uma variável do Enum que pretendo chamar na classe de Validador
	    ValidatorParameterUmEnum vParameterUm;
	    
		// Chama a Classe Validador passando o objeto e a variavel de Enum
		validator.UmValidator(resource, vParameterUm);		
	   
	    
	    if (validator.isValid()) { 
			// Faça alguma coisa
		}
}



// Enums de validação
public enum ValidatorParameterUmEnum implements InterfaceParameterValidator {
	
	NOT_NULL_CAMPO1("Campo não pode ser null") {
		@Override
		public boolean validate(Resource resource) {
			return !resource.getName().isEmpty();
		}
	};
	
	public final String errorMessage;
	
	private ValidatorParameterPathEnum(String errorMessage) {
		this.errorMessage = errorMessage;
	}
	
	boolean validate(Resource resource );

}

public enum ValidatorParameterDoisEnum implements InterfaceParameterValidator {
	
	NOT_NULL_CAMPO_ABC("CampoABC não pode ser null") {
		@Override
		public boolean validate(Resource resource) {
			return !resource.getTipo().isEmpty();
		}
	},
		NOT_NULL_CAMPO_XYZ("CampoXYZ não pode ser null") {
		@Override
		public boolean validate(Resource resource) {
			return !resource.getDescricao().isEmpty();
		}
	};
	
	public final String errorMessage;
	
	private ValidatorParameterPathEnum(String errorMessage) {
		this.errorMessage = errorMessage;
	}
	
	boolean validate(Resource resource );

}
P

Para aceder ao values de um enum qualquer genérico penso que so por reflection

public <T extends Enum<T> & GenericEnum> void GenericValidator( Resource resource, Class<T> vParameterUm ) {
	
	for( GenericEnum validator : getEnumValues(vParameterUm)) {
		if(!validator.validate(resource)) {
			errors.add(validator.errorMessage);
		}
	}
}

private static <T extends Enum & MyInterface> T[] getEnumValues(Class<T> enumClass) {
  try {
     Field f = enumClass.getDeclaredField("$VALUES");
     f.setAccessible(true);
     return (T[]) f.get(null);
   } catch (NoSuchFieldException | IllegalAccessException e) {
       e.printStackTrace();
      return null;
   }
 }
Criado 23 de abril de 2020
Ultima resposta 24 de abr. de 2020
Respostas 4
Participantes 3