Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Uso incomum de INTERFACE como se fosse ENUM

Analisando um código da minha empresa, notei um código que me causou estranheza.

Foram implementadas várias estruturas de INTERFACE dentro de uma classe simulando, ao que me parece, um ENUM.

public class ClasseABC {
    public interface TipoArquivo {
        String SistemaInterno = "1";
        String SistemaExterno = "2";
    }
...
    public interface Status {
        String Pendente = "P";
        String Devolvido = "D";
    }

E em códigos de outras classes ele referenciava:

if (ClasseABC.Status.Pendente.equals(statusAtual)) {
...

Gostaria de saber se alguém sabe me dizer se isso se trata apenas de uma má prática ou se em algum momento das versões do Java este tipo de implementação era comum.

3 respostas

Realmente é uma abordagem incomum, o mais usual seria colocá-las juntas em um pacote e usar arquivos de origem separados.

O mais estranho é a abordagem de INTERFACE fora de sua prática funcional. Se estivessem em arquivos fontes diferentes, acredito que não funcionaria da maneira que implementaram.

solução!

Oi Gilberto! Tudo bem?

Isso é uma excelente pergunta e a resposta depende do gosto de quem utiliza.

1) Eu, honestamente não gosto de utilizar uma interface para colocar constantes no contexto do objeto em questão.

2) Recomendo utilizar static import para colocar constantes no contexto de seu objeto.

3) Recomendo utilizar classes e inner classes para criar esses bundles de constantes, que organizam o código, melhoram a leitura e o resultado disso é facilidade de manutenção.

4) É necessário entender que Enums e Constantes são conceitos diferentes, ou seja, precisa representar o valor do PI, é uma utilização de constante. Precisa definir valores aceitos por um atributo de um objeto, como GENERO, aí é uma aplicação de ENUM.

Segue um exemplo de bundle de constantes:

package com.example.demo;

public class WebConstants {

    public static class Pages {
        public static final String INDEX = "index.jsp";
        public static final String CUSTOMERS = "customers.jsp";
        public static final String CUSTOMER = "customer.jsp";
        public static final String EMPLOYEES = "employees.jsp";
        public static final String EMPLOYEE = "employee.jsp";        
    }

    public static class ControllerMappings {
        public static final String INDEX = "/";
        public static final String CUSTOMERS = "/customers";
        public static final String CUSTOMER = "/customer/{id}";
        public static final String EMPLOYEES = "/employees";
        public static final String EMPLOYEE = "employee/{id}";            
    }

}

E a utilização dessas contantes ficaria assim:

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import static com.example.demo.WebConstants.*;

@Controller
public class CustomerController {

    @RequestMapping(ControllerMappings.EMPLOYEES)
    public String employees(){

        // ... ommited code!

        return Pages.EMPLOYEES;
    }

}

Caso siga com dúvida, estou por aqui.

Abraço e sucesso,

Att,

Rodrigo