Sistema de ServiçosJavaFX

Tela Cadastro Técnico

A funcionalidade Cadastro de Técnico oferece uma interface intuitiva para registrar novos profissionais. Os campos a serem preenchidos incluem ID, nome, e-mail, senha, CPF, salário e data de criação. O sistema realiza a validação das informações inseridas, garantindo a segurança e a integridade dos dados, além de facilitar a gestão eficiente dos técnicos cadastrados.

CadastroTecnico

Passo a Passo para Criar o Arquivo XML de Cadastro de Técnico

  • 1. Navegar até a Pasta de Recursos:

    • No painel do projeto, expanda a pasta resources.
    • Navegue até o caminho br/com/professorclaytonandrade/sistemaservicojavafx.

    2. Criar o Arquivo XML:

    • Clique com o botão direito do mouse na pasta sistemaservicojavafx.
    • No menu de contexto que aparece, selecione New (Novo) e, em seguida, clique em File (Arquivo).

    3. Nomear o Arquivo:

    • Digite cadastro-tecnico-view.fxml como o nome do arquivo e pressione Enter.
    • Certifique-se de que a extensão do arquivo seja .fxml.
  • 4. Estrutura de Pastas do Projeto:

    A estrutura de pastas do projeto após a criação do arquivo cadastro-tecnico-view.fxml deve se parecer com isto:

ProjetoJavaFX/
│
├── src/
│   ├── br.com.professorclaytonandrade.sistemaservicojavafx
│   │   ├── controller
│   │   │   ├── StartViewController.java          // Controlador para a tela inicial
│   │   │   ├── CadastroTecnicoController.java    // Controlador para a tela de cadastro de técnico
│   │   └── model
│   │       ├── ...                               // Modelos de dados (opcional)
│   └── ...                                       // Outros pacotes
├── resources/
│   ├── br.com.professorclaytonandrade.sistemaservicojavafx
│   │   ├── start-view.fxml                       // Arquivo XML da tela inicial
│   │   ├── cadastro-tecnico-view.fxml            // Arquivo XML da tela de cadastro de técnico
│   │   └── ...                                   // Outros arquivos de visualização
│   └── ...                                       // Outros pacotes
└── ...

  • Criando os Componentes da Tela Principal:

    • Obeserve o víde para entender as configurações dos componentes da tela.
  • Código FXML:

    • Depois de criar o arquivo e criar os componentes, o código cadastro-tecnico-view.fxml deve ficar mais ou menos assim:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="372.0" prefWidth="519.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="br.com.professorclaytonandrade.sistemaservicojavafx.controller.CadastroTecnicoController">
    <children>
        <VBox alignment="CENTER" prefHeight="341.0" prefWidth="500.0" spacing="10" 
                AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10" 
                AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10">
            <!-- Title Section -->
            <Label text="Cadastro de Técnico" textAlignment="CENTER">
                <font>
                    <Font size="24" />
                </font>
            </Label>

            <!-- Form Section -->
            <GridPane hgap="10" vgap="10">
                <padding>
                    <Insets bottom="10" left="20" right="20" top="10" />
                </padding>

                <!-- Labels and Fields -->
                <Label text="ID:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
                <TextField fx:id="idField" editable="false" prefHeight="25.0" prefWidth="385.0" 
                    GridPane.columnIndex="1" GridPane.rowIndex="0" />

                <Label text="Nome:" GridPane.columnIndex="0" GridPane.rowIndex="1" />
                <TextField fx:id="nomeField" prefWidth="191.0" 
                    GridPane.columnIndex="1" GridPane.rowIndex="1" />

                <Label text="Email:" GridPane.columnIndex="0" 
                    GridPane.rowIndex="2" />
                <TextField fx:id="emailField" prefWidth="191.0" GridPane.columnIndex="1" 
                    GridPane.rowIndex="2" />

                <Label text="Senha:" GridPane.columnIndex="0" 
                    GridPane.rowIndex="3" />
                <PasswordField fx:id="senhaField" prefWidth="191.0" GridPane.columnIndex="1" 
                    GridPane.rowIndex="3" />

                <Label text="CPF:" GridPane.columnIndex="0" 
                    GridPane.rowIndex="4" />
                <TextField fx:id="cpfField" prefHeight="25.0" prefWidth="191.0" 
                    GridPane.columnIndex="1" GridPane.rowIndex="4" />

                <Label text="Salário:" GridPane.columnIndex="0" 
                    GridPane.rowIndex="5" />
                <TextField fx:id="salarioField" prefHeight="25.0" prefWidth="191.0" 
                    GridPane.columnIndex="1" GridPane.rowIndex="5" />

                <Label text="Data de Criação:" GridPane.columnIndex="0" 
                    GridPane.rowIndex="6" />
                <DatePicker fx:id="dataCriacaoField" editable="false" prefHeight="25.0" prefWidth="376.0" 
                    GridPane.columnIndex="1" GridPane.rowIndex="6" />

                <columnConstraints>
                   <ColumnConstraints maxWidth="99.0" minWidth="81.0" prefWidth="99.0" />
                   <ColumnConstraints maxWidth="369.0" minWidth="351.0" prefWidth="351.0" />
                </columnConstraints>
            </GridPane>

            <!-- Buttons Section -->
            <HBox alignment="BOTTOM_RIGHT" prefHeight="25.0" prefWidth="431.0" spacing="10">
                <Button fx:id="cancelarButton" onAction="#cancelar" 
                    prefHeight="25.0" prefWidth="71.0" text="Cancelar" textAlignment="CENTER">
                    <HBox.margin>
                        <Insets right="5.0" />
                    </HBox.margin>
                </Button>
                <Button fx:id="salvarButton" onAction="#salvar" 
                    prefHeight="25.0" prefWidth="56.0" text="Salvar" textAlignment="CENTER">
                    <HBox.margin>
                        <Insets right="15.0" />
                    </HBox.margin>
                </Button>
            </HBox>
        </VBox>
    </children>
</AnchorPane>

Código Java Tela Cadastro Técnico

A estruturação de um código JavaFX com controladores segue um padrão de design que visa separar a lógica de controle da apresentação visual, promovendo uma arquitetura mais limpa e manutenível. O controlador, neste caso, o CadastroTecnicoController, é responsável por gerenciar a interação entre os componentes da interface gráfica e as ações do usuário, assegurando que os dados sejam corretamente capturados, validados e processados. Esta classe atua como um intermediário entre o layout definido em FXML e a lógica de negócios, possibilitando operações como a criação, edição e validação de informações de técnicos.

No exemplo em questão, o CadastroTecnicoController facilita o fluxo de dados, permitindo que os usuários insiram informações essenciais, como nome, e-mail e CPF, enquanto garante que os campos sejam preenchidos adequadamente antes de permitir a ação de salvar. Essa separação de responsabilidades não só melhora a organização do código, mas também torna a aplicação mais robusta e fácil de manter.

Abaixo, apresentamos uma descrição passo a passo do funcionamento do código, elucidando como essa arquitetura é implementada em um projeto JavaFX:

OBS: Alguns métodos serão implementados posteriormente na sequência do tutorial.

    1. Passo 1: Estrutura do Pacote
      1. Crie a Estrutura do Pacote:
        • Navegue até o seu diretório de projeto Java.
        • Dentro do diretório src, crie a estrutura de pacotes conforme br/com/professorclaytonandrade/sistemaservicojavafx/controller.

      Passo 2: Criar a Classe Controller

      1. Criar o Arquivo da Classe:
        • Dentro do pacote controller, crie um arquivo chamado CadastroTecnicoController.java.

      Passo 3: Importações Necessárias

      1. Importar Classes Necessárias:
        • No início do arquivo, importe as classes necessárias:
import br.com.professorclaytonandrade.sistemaservicojavafx.dto.TecnicoDto;
import br.com.professorclaytonandrade.sistemaservicojavafx.service.TecnicoService;
import br.com.professorclaytonandrade.sistemaservicojavafx.util.Mensagens;
import br.com.professorclaytonandrade.sistemaservicojavafx.util.Util;
import javafx.beans.value.ChangeListener;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.stage.Stage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
  • Passo 4: Definir a Classe e Variáveis

    1. Definir a Classe e Variáveis:
      • Crie a classe CadastroTecnicoController e defina as variáveis necessárias:
public class CadastroTecnicoController {
    private static final Logger logger = LoggerFactory.getLogger(TecnicoService.class);

    @FXML
    private Button cancelarButton;
    @FXML
    private Button salvarButton;
    @FXML
    private TextField cpfField;
    @FXML
    private DatePicker dataCriacaoField;
    @FXML
    private TextField emailField;
    @FXML
    private TextField idField;
    @FXML
    private TextField nomeField;
    @FXML
    private TextField salarioField;
    @FXML
    private PasswordField senhaField;

    private TecnicoService tecnicoService;
    private boolean edicao = false;

    public CadastroTecnicoController() {
        this.tecnicoService = new TecnicoService(); // Inicializando o serviço
    }
  • Passo 5: Inicialização

    1. Método initialize:
      • Adicione o método initialize que será chamado após o carregamento do FXML:
@FXML
public void initialize() {
    ChangeListener campoListener = (observable, oldValue, newValue) ->
        salvarButton.setDisable(!todosCamposPreenchidos());

    nomeField.textProperty().addListener(campoListener);
    emailField.textProperty().addListener(campoListener);
    senhaField.textProperty().addListener(campoListener);
    cpfField.textProperty().addListener(campoListener);
    salarioField.textProperty().addListener(campoListener);
    dataCriacaoField.valueProperty().addListener((observable, oldValue, newValue) ->
        salvarButton.setDisable(!todosCamposPreenchidos()));

    // Inicialmente, o botão "Salvar" está desativado.
    salvarButton.setDisable(true);
}

O método initialize() no código fornecido é um método especial do controlador JavaFX que é chamado automaticamente após a injeção de dependências FXML ser concluída. O propósito principal deste método é configurar o estado inicial da interface gráfica e registrar ouvintes para interações do usuário. Vamos analisar cada parte do código:

@FXML
public void initialize() {
    ChangeListener campoListener = (observable, oldValue, newValue) ->
        salvarButton.setDisable(!todosCamposPreenchidos());
        ....
}
  • @FXML: Esta anotação indica que o método initialize é um método que pode ser chamado pelo sistema JavaFX após a carga do arquivo FXML. É parte do ciclo de vida do controlador.

  • ChangeListener<String> campoListener: Um ouvinte de mudanças (ChangeListener) é criado para monitorar alterações em propriedades de texto (neste caso, os campos de entrada de texto). Ele escuta alterações nos valores de texto dos campos.

  • salvarButton.setDisable(!todosCamposPreenchidos()): Esta linha habilita ou desabilita o botão “Salvar”. O botão ficará desabilitado (setDisable(true)) se a função todosCamposPreenchidos() retornar false, indicando que nem todos os campos obrigatórios foram preenchidos.

    nomeField.textProperty().addListener(campoListener);
    emailField.textProperty().addListener(campoListener);
    senhaField.textProperty().addListener(campoListener);
    cpfField.textProperty().addListener(campoListener);
    salarioField.textProperty().addListener(campoListener);
  • Adicionando Ouvintes: Aqui, o ouvinte campoListener é adicionado a vários campos de entrada (nome, e-mail, senha, CPF e salário). Cada vez que o texto em qualquer um desses campos é alterado, o método campoListener é acionado, que, por sua vez, atualiza o estado do botão “Salvar” de acordo com a validação.
    dataCriacaoField.valueProperty().addListener((observable, oldValue, newValue) ->
        salvarButton.setDisable(!todosCamposPreenchidos()));
  • Ouvinte para dataCriacaoField: Um ouvinte separado é adicionado ao campo dataCriacaoField, que não é um campo de texto, mas sim um DatePicker. O ouvinte verifica se a data foi preenchida ou não, novamente utilizando todosCamposPreenchidos() para determinar se o botão “Salvar” deve ser habilitado ou desabilitado.
    // Inicialmente, o botão "Salvar" está desativado.
    salvarButton.setDisable(true);
}
  • Desabilitando o Botão “Salvar” Inicialmente: Finalmente, o botão “Salvar” é inicialmente desativado. Isso garante que o usuário não possa tentar salvar as informações até que todos os campos obrigatórios sejam preenchidos.
  • Passo 6: Implementar Métodos de Ação

    1. Métodos cancelar e salvar:
      • Adicione métodos para as ações dos botões:
@FXML
void cancelar() {
    fecharJanela();
}

@FXML
void salvar() {
    try {
        salvarAlteracoes();
        Util.exibirAlerta(Alert.AlertType.INFORMATION, Mensagens.TITULO_CONFIRMACAO_SALVAMENTO, null, Mensagens.MSG_INF_SALVAS_COM_SUCESSO);
        limparCampos();
        if(edicao) fecharJanela();
    } catch (IllegalArgumentException e) {
        Util.exibirAlerta(Alert.AlertType.ERROR, Mensagens.TITULO_ERRO_VALIDACAO, null, Mensagens.MSG_ERRO_AO_SALVAR_INFORMACOES + e.getMessage());
    } catch (Exception e) {
        Util.exibirAlerta(Alert.AlertType.ERROR, Mensagens.TITULO_ERRO_AO_SALVAR, null, Mensagens.MSG_ERRO_AO_SALVAR_INFORMACOES + e.getMessage());
    }
}
  • Passo 7: Salvar Alterações

    1. Método salvarAlteracoes:
      • Implemente o método para salvar as informações:
private void salvarAlteracoes() {
    Long id = !idField.getText().trim().isEmpty() ? Long.valueOf(idField.getText().trim()) : null;
    Double salario = !salarioField.getText().isEmpty() ? Double.valueOf(salarioField.getText().trim()) : null;
    TecnicoDto tecnicoDto = new TecnicoDto(id, nomeField.getText().trim(), emailField.getText().trim(), senhaField.getText().trim(), cpfField.getText().trim(), salario);
    if (tecnicoDto.getId() == null) {
        tecnicoService.criar(tecnicoDto); // Adiciona novo técnico
    } else {
        tecnicoService.atualizar(tecnicoDto); // Atualiza técnico existente
        edicao = true;
    }
}

  • Passo 8: Métodos Adicionais

    1. Métodos setDado, limparCampos, todosCamposPreenchidos e fecharJanela:
      • Adicione os métodos restantes para gerenciar dados e a interface:
      • Método setDado

        Este método é responsável por popular os campos da interface com os dados de um técnico existente. Isso é útil ao editar um registro, permitindo que o usuário visualize e altere as informações.

      • Método limparCampos

        Este método é usado para limpar todos os campos da interface. É chamado após a inserção ou edição de um registro para que o formulário fique pronto para a próxima entrada de dados.

      • Método todosCamposPreenchidos

        Esse método verifica se todos os campos obrigatórios foram preenchidos. Retorna true se todos os campos estiverem preenchidos, caso contrário, retorna false. Este método é essencial para habilitar ou desabilitar o botão “Salvar”.

      • Método fecharJanela

        Esse método é responsável por fechar a janela atual, sendo útil após a confirmação de ações como a cancelamento ou a finalização do cadastro.

public void setDado(TecnicoDto tecnicoDto) {
    if (tecnicoDto != null) {
        idField.setText(String.valueOf(tecnicoDto.getId()));
        nomeField.setText(tecnicoDto.getNome());
        emailField.setText(tecnicoDto.getEmail());
        senhaField.setText(tecnicoDto.getSenha());
        cpfField.setText(tecnicoDto.getCpf());
        salarioField.setText(String.valueOf(tecnicoDto.getSalario()));
        dataCriacaoField.setValue(tecnicoDto.getDataCriacao());
    }
}

private void limparCampos() {
    idField.clear();
    nomeField.clear();
    emailField.clear();
    senhaField.clear();
    cpfField.clear();
    salarioField.clear();
    dataCriacaoField.setValue(null);
}

private boolean todosCamposPreenchidos() {
    return !nomeField.getText().trim().isEmpty() &&
            !emailField.getText().trim().isEmpty() &&
            !senhaField.getText().trim().isEmpty() &&
            !cpfField.getText().trim().isEmpty() &&
            !salarioField.getText().trim().isEmpty() &&
            dataCriacaoField.getValue() != null;
}

private void fecharJanela() {
    Stage stage = (Stage) cancelarButton.getScene().getWindow();
    stage.close();
}
  • 9. Código CadastroTecnicoController

    • O código completo da implementação deve ficar assim:
package br.com.professorclaytonandrade.sistemaservicojavafx.controller;

import br.com.professorclaytonandrade.sistemaservicojavafx.dto.TecnicoDto;
import br.com.professorclaytonandrade.sistemaservicojavafx.service.TecnicoService;
import br.com.professorclaytonandrade.sistemaservicojavafx.util.Mensagens;
import br.com.professorclaytonandrade.sistemaservicojavafx.util.Util;
import javafx.beans.value.ChangeListener;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.stage.Stage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CadastroTecnicoController {
    private static final Logger logger = LoggerFactory.getLogger(TecnicoService.class);

    @FXML
    private Button cancelarButton;

    @FXML
    private Button salvarButton;

    @FXML
    private TextField cpfField;

    @FXML
    private DatePicker dataCriacaoField;

    @FXML
    private TextField emailField;

    @FXML
    private TextField idField;

    @FXML
    private TextField nomeField;

    @FXML
    private TextField salarioField;

    @FXML
    private PasswordField senhaField;

    private TecnicoService tecnicoService;

    private boolean edicao =  false;

    public CadastroTecnicoController() {
        this.tecnicoService = new TecnicoService(); // Inicializando o serviço;
    }

    @FXML
    public void initialize() {

        ChangeListener campoListener = (observable, oldValue, newValue) ->
                salvarButton.setDisable(!todosCamposPreenchidos());
        nomeField.textProperty().addListener(campoListener);
        emailField.textProperty().addListener(campoListener);
        senhaField.textProperty().addListener(campoListener);
        cpfField.textProperty().addListener(campoListener);
        salarioField.textProperty().addListener(campoListener);
        dataCriacaoField.valueProperty().addListener((observable, oldValue, newValue) ->
                salvarButton.setDisable(!todosCamposPreenchidos()));

        // Inicialmente, o botão "Salvar" está desativado.
        salvarButton.setDisable(true);
    }

    @FXML
    void cancelar() {
        fecharJanela();
    }

    @FXML
    void salvar() {
        try {
            salvarAlteracoes();
            Util.exibirAlerta(Alert.AlertType.INFORMATION, Mensagens.TITULO_CONFIRMACAO_SALVAMENTO, null,
                Mensagens.MSG_INF_SALVAS_COM_SUCESSO);
            limparCampos();
            if(edicao) fecharJanela();
        } catch (IllegalArgumentException e) {
            Util.exibirAlerta(Alert.AlertType.ERROR, 
                Mensagens.TITULO_ERRO_VALIDACAO, null, 
                Mensagens.MSG_ERRO_AO_SALVAR_INFORMACOES + e.getMessage());
        } catch (Exception e) {
            Util.exibirAlerta(Alert.AlertType.ERROR, Mensagens.TITULO_ERRO_AO_SALVAR, null, 
            Mensagens.MSG_ERRO_AO_SALVAR_INFORMACOES + e.getMessage());
        }
    }

    private void salvarAlteracoes() {
        Long id = !idField.getText().trim().isEmpty() ? Long.valueOf(idField.getText().trim()) : null;
        Double salario = !salarioField.getText().isEmpty() ?
            Double.valueOf(salarioField.getText().trim()) : null;
        TecnicoDto tecnicoDto = new TecnicoDto(id, nomeField.getText().trim(), 
            emailField.getText().trim(), senhaField.getText().trim(), 
            cpfField.getText().trim(), salario);
        if (tecnicoDto.getId() == null) {
            tecnicoService.criar(tecnicoDto); // Adiciona novo técnico
        } else {
            tecnicoService.atualizar(tecnicoDto); // Atualiza técnico existente
            edicao = true;
        }
    }

    public void setDado(TecnicoDto tecnicoDto) {
        if (tecnicoDto != null) {
            idField.setText(String.valueOf(tecnicoDto.getId()));
            nomeField.setText(tecnicoDto.getNome());
            emailField.setText(tecnicoDto.getEmail());
            senhaField.setText(tecnicoDto.getSenha());
            cpfField.setText(tecnicoDto.getCpf());
            salarioField.setText(String.valueOf(tecnicoDto.getSalario()));
            dataCriacaoField.setValue(tecnicoDto.getDataCriacao());
        }
    }

    private void limparCampos() {
        // Limpar todos os campos
        idField.clear();
        nomeField.clear();
        emailField.clear();
        senhaField.clear();
        cpfField.clear();
        salarioField.clear();
        dataCriacaoField.setValue(null);
    }

    private boolean todosCamposPreenchidos() {
        return !nomeField.getText().trim().isEmpty() &&
                !emailField.getText().trim().isEmpty() &&
                !senhaField.getText().trim().isEmpty() &&
                !cpfField.getText().trim().isEmpty() &&
                !salarioField.getText().trim().isEmpty() &&
                dataCriacaoField.getValue() != null;
    }

    private void fecharJanela() {
        Stage stage = (Stage) cancelarButton.getScene().getWindow();
        stage.close();
    }
}

Código Java Pessoa (Super Classe de Tecnico e Ciente)

A classe Pessoa define uma entidade base que será usada como modelo para outras classes no sistema. Ela é uma classe abstrata, o que significa que não pode ser instanciada diretamente, mas serve como uma estrutura para classes filhas que herdarão suas propriedades e métodos. A seguir, vou detalhar cada parte dessa classe, explicando passo a passo seu funcionamento.

1. Declaração da Classe

public abstract class Pessoa {
...
}
  • Classe Abstrata: A classe Pessoa é declarada como abstrata, o que significa que ela não pode ser instanciada diretamente. Isso implica que a classe será usada apenas como base para outras classes derivadas, como Tecnico ou Cliente, que podem estender essa classe.
  • Finalidade: Essa classe define atributos e comportamentos comuns (como id, nome, email, etc.) que todas as subclasses de Pessoa terão.

2. Atributos da Classe

protected Long id;
protected String nome;
protected String email;
protected String senha;
protected String cpf;
protected LocalDate dataCriacao = LocalDate.now();
  • Visibilidade protected: Os atributos são declarados como protected, o que significa que eles podem ser acessados diretamente por subclasses, mas não são acessíveis de fora da hierarquia de herança.
  • Atributos:
    • id: Um identificador único do tipo Long para representar a identidade da pessoa.
    • nome: O nome da pessoa, do tipo String.
    • email: O email da pessoa, do tipo String.
    • senha: A senha da pessoa, armazenada como String.
    • cpf: O Cadastro de Pessoa Física (CPF) da pessoa, do tipo String, que serve como um identificador único no Brasil.
    • dataCriacao: A data de criação do registro da pessoa, definida como um LocalDate. Ao inicializar, recebe a data atual por meio do método LocalDate.now().

3. Construtor Padrão (Sem Argumentos)

public Pessoa() {
}
  • Construtor Vazio: Esse construtor permite criar um objeto Pessoa (ou de uma classe derivada) sem a necessidade de passar argumentos. Ele é necessário para casos em que você deseja inicializar um objeto e definir os valores de seus atributos posteriormente.

4. Construtor Completo (Com Argumentos)

public Pessoa(Long id, String nome, String email, String senha, String cpf, LocalDate dataCriacao) {
    this.id = id;
    this.nome = nome;
    this.email = email;
    this.senha = senha;
    this.cpf = cpf;
    this.dataCriacao = dataCriacao;
}
  • Construtor Parametrizado: Este construtor é utilizado para criar uma instância da classe Pessoa (ou de suas subclasses) já com todos os atributos preenchidos. Isso facilita a inicialização de objetos com todos os valores desejados.
    • this.id, this.nome, etc. são usados para atribuir os valores dos parâmetros passados (id, nome, etc.) aos atributos correspondentes da classe.

5. Métodos get e set

Métodos de Acesso (Getters)

public Long getId() {
    return id;
}

public String getNome() {
    return nome;
}

public String getEmail() {
    return email;
}

public String getSenha() {
    return senha;
}

public String getCpf() {
    return cpf;
}

public LocalDate getDataCriacao() {
    return dataCriacao;
}
  • Métodos get: São usados para acessar os valores dos atributos privados ou protegidos de um objeto. Eles seguem a convenção de nomeação, iniciando com “get” seguido do nome do atributo com a primeira letra em maiúscula.
    • Por exemplo, getNome() retorna o valor do atributo nome.

Métodos Modificadores (Setters)

public void setId(Long id) {
    this.id = id;
}

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

public void setEmail(String email) {
    this.email = email;
}

public void setSenha(String senha) {
    this.senha = senha;
}

public void setCpf(String cpf) {
    this.cpf = cpf;
}

public void setDataCriacao(LocalDate dataCriacao) {
    this.dataCriacao = dataCriacao;
}
  • Métodos set: São usados para modificar o valor dos atributos do objeto. Eles seguem uma estrutura similar aos getters, mas começam com “set” e aceitam um parâmetro que será atribuído ao atributo correspondente.
      • Por exemplo, setNome(String nome) altera o valor do atributo nome para o valor passado como parâmetro.

6. Finalidade Geral da Classe

A classe Pessoa é projetada para servir como uma superclasse que contém os atributos e métodos comuns a qualquer tipo de pessoa (seja um técnico, cliente ou outro tipo). Esses atributos incluem informações básicas como nome, email, e cpf. Ao ser abstrata, a classe não pode ser instanciada diretamente; outras classes devem estendê-la, garantindo que essas classes herdem a estrutura e os comportamentos definidos em Pessoa.

  • Exemplo de Subclasse: Um exemplo de uso seria uma classe Tecnico que herda de Pessoa:
public class Tecnico extends Pessoa {
    // Atributos e métodos específicos de Técnico.
}
  • Neste exemplo, Tecnico herdaria automaticamente os atributos e métodos de Pessoa, como nome, email, getNome(), setNome(), etc., além de poder adicionar novos atributos e comportamentos específicos de um técnico.

7. Conclusão

A classe Pessoa é fundamental para criar um sistema baseado em herança, onde características comuns são centralizadas, e as subclasses podem se concentrar nas suas particularidades. Esse design facilita a manutenção e a extensão do sistema, já que as funcionalidades comuns a todas as pessoas (como nome, cpf, etc.) não precisam ser reescritas em cada classe específica.