Estou estudando sobre a aplicação de enums e constantes no Java como meio de eliminar os famosos “valores mágicos” do código e atribuir maior sentido à lógica empregada. Numa classe “User” por exemplo, com um atributo “acessLevel” do tipo String, compreendo que utilizar um tipo específico com valores pré-determinados (como acontece nas enums) é vantajoso pois limita a atribuição de valores ao atributo, ao invés de qualquer String.
Minha dúvida é a respeito da quantidade de arquivos que irão surgir ao criar uma enum toda vez que achar necessário limitar os valores do atributo. Esta é realmente uma boa prática de programação? Há formas melhores de evitar os “valores mágicos”?
Como exemplo deixo a classe “User” que comentei, juntamente com a enum AcessLevel. Reparem que dois dos atributos do usuário são enums específicas, ao invés de tipos mais abrangentes como String.
package home.room.models;
// @author;
public class User {
private int id;
private String name;
private String password;
private AcessLevel accessLevel;
private ActivityStatus activityStatus;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public AcessLevel getAccessLevel() {
return accessLevel;
}
public void setAccessLevel(String accessName) {
if(accessName.equals(AcessLevel.ADMIN_ACESS.getName())) {
this.accessLevel = AcessLevel.ADMIN_ACESS;
}else {
this.accessLevel = AcessLevel.COMMON_ACCESS;
}
}
public ActivityStatus getActivityStatus() {
return activityStatus;
}
public void setActivityStatus(String activityStatus) {
if(activityStatus.equals(ActivityStatus.ACTIVE_USER.toString())) {
this.activityStatus = ActivityStatus.ACTIVE_USER;
}else {
this.activityStatus = ActivityStatus.INACTIVE_USER;
}
}
}
Enum AcessLevel:
package home.room.models;
// @author Rodrigo Alberto;
public enum AcessLevel {
ADMIN_ACESS("Administrativo"),
COMMON_ACCESS("Comum");
private final String name;
private AcessLevel(String name) {
this.name = name;
}
public String getName() {
return name;
}
}