Funcionar, funciona... mas esta certo?

Boa tarde colegas !

Cá estou eu novamente…

Tenho uma classe Cliente, que possui um atributo Status.

No Banco de dados Status é uma coluna que pode ser “A” de Ativo ou “I” de Inativo.

Acontece que na tela quero utilizar um JComboBox onde aparece: A - Ativo e I - Inativo.

Bom inicialmente eu tinha na minha classe cliente um atributo
Strint status;

E na interface eu fazia um if pra transformar “A” em “A - Ativo”.

Dai optei por criar uma classe Status, com 2 atributos:
idStatus (A ou I) e descricao (Ativo ou Inativo).

E na classe cliente troquei de String status para Status status;

Não sei se ficou claro (eu sou péssimo pra explicar)… mas se tiver ficado, isso é o mais certo ?

Seguem os trechos de codigo:

Classe Status:

public class Status implements Serializable {

    private String idStatus;
    private String descricao;

    public Status(String p_id) {
        this.idStatus = p_id;
        if (p_id.equals("A"))
            this.descricao = "Ativo";
        else
            this.descricao = "Inativo";
    }

    public String getIdstatus(){
        return this.idStatus;
    }
    
    public String getIdDescricao(){
        return this.descricao;
    }    
    
    
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Status)) {
            return false;
        }
        Status other = (Status)object;
        if (this.idStatus != other.idStatus && (this.idStatus == null || !this.idStatus.equals(other.idStatus))) return false;
        return true;
    }

    public String toString() {
        return idStatus + " - " + descricao;
    }
    
}

Classe Cliente:


public class Cliente implements Serializable {

    @Column(name = "cl_clStatus")
    private Status status;

    public Status getStatus() {
        return this.status;
    }
    public void setStatus(Status status) {
        this.status = status;
    }

E agora a parte que esta me deixando incabulado:

Classe CadastroCliente (inteface do usuario)
Carregando o JComboBox com as opções possíveis…


    private void carregaCmbStatus() {
        cmbStatus.addItem(new Status("A"));
        cmbStatus.addItem(new Status("I"));
    }                

Mostrando no JComboBox o status de um cliente:

private void mostraDados(Cliente cliente) {
      cmbStatus.setSelectedItem(cliente.getStatus());        

Pegando um status selecionado no combo e passando para um objeto Cliente que depois será persistido:

private void btGravarActionPerformed(java.awt.event.ActionEvent evt) {                                         
     clienteTemp.setStatus((Status)cmbStatus.getSelectedItem());

Recuperando os dados de um cliente do banco e que será mostrado na tela:

public Cliente buscarCliente(int idCliente) {
    clienteTemp.setStatus(new Status(rs.getString("cl_clStatus")));

Passando o status de um cliente para um prepareStatement que irá atualizar o banco

public void atualizaCliente(Cliente cliente){
     stp.setString(12, cliente.getStatus().getIdstatus());

O que me deixou em duvida foi principalmente porque não existe uma tabela Status no banco de dados, porque as opções são somente A ou I, e não devem mudar…

Por outro lado o que me levou a criar uma classe Status é que em outras partes do sistema terei a mesma situação para outras entidades… isso me pareceu ser suficiente para criar a classe ao invés de ficar fazendo:

if (this.status.equals("A") 
    cmbStatus.setSelectedItem("A - Ativo");
else
    cmbStatus.setSelectedItem("I - Ativo");

em cada entidade que tenha o tal do status.

Se alguém puder opinar, fico muito grato !

Abraços a todos.

se vc ker ter algo para representar o status e este algo deve ter opções fixas , vc pode usar um enum para isso, ae vc tera certeza que o status será ou A ou I e nada mais…

aki tem um tutorial da sun sobre enums

http://java.sun.com/docs/books/tutorial/java/javaOO/enum.html

Status é um conceito de máquina de estado. Os estados têm que ser identificados mas não têm uma ordem pre-defenida. O processo definirá a ordem. Eles podem ser identificados por numeros, mas para não gerar confusão de ordem que não existe, letras seria melhor.
Vc precisa de 3 coisas:
definir como persiste o status no banco
definir como trabalha com ele via codigo
definir como apresentar na tela

O primeiro vc escolhe entre char ou int
O segundo vc usa Enum como já foi dito aqui. E consequentemente terá que ter uma forma de transformar em enum o que escolheu no primeiro item. Vc faz isto atraves de um mapeador.
O terceito vc resolve com um formatador e/ou um renderer.
O formatador pode ser usado em JSP ou em qq outro lugar
O Render é especialmente necessário em Swing/AWT.
Desta forma se o o estado ativo é representado por Status.ACTIVO no seu codigo isso será mapeado para/e do banco pelo mapeador e para a tela pelo formatador/renderizador

Este é o jeito correto de fazer. Mas dá trabalho :wink: