

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.


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.
- No painel do projeto, expanda a pasta
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.
- Passo 1: Estrutura do Pacote
- Crie a Estrutura do Pacote:
- Navegue até o seu diretório de projeto Java.
- Dentro do diretório
src
, crie a estrutura de pacotes conformebr/com/professorclaytonandrade/sistemaservicojavafx/controller
.
Passo 2: Criar a Classe Controller
- Criar o Arquivo da Classe:
- Dentro do pacote
controller
, crie um arquivo chamadoCadastroTecnicoController.java
.
- Dentro do pacote
Passo 3: Importações Necessárias
- Importar Classes Necessárias:
- No início do arquivo, importe as classes necessárias:
- Crie a Estrutura do Pacote:
- Passo 1: Estrutura do Pacote
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
- Definir a Classe e Variáveis:
- Crie a classe
CadastroTecnicoController
e defina as variáveis necessárias:
- Crie a classe
- Definir a Classe e Variáveis:
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
- Método
initialize
:- Adicione o método
initialize
que será chamado após o carregamento do FXML:
- Adicione o método
- Método
@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étodoinitialize
é 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çãotodosCamposPreenchidos()
retornarfalse
, 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étodocampoListener
é 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 campodataCriacaoField
, que não é um campo de texto, mas sim umDatePicker
. O ouvinte verifica se a data foi preenchida ou não, novamente utilizandotodosCamposPreenchidos()
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
- Métodos
cancelar
esalvar
:- Adicione métodos para as ações dos botões:
- Métodos
@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
- Método
salvarAlteracoes
:- Implemente o método para salvar as informações:
- Método
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
- Métodos
setDado
,limparCampos
,todosCamposPreenchidos
efecharJanela
:- 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, retornafalse
. 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.
- Métodos
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, comoTecnico
ouCliente
, que podem estender essa classe. - Finalidade: Essa classe define atributos e comportamentos comuns (como
id
,nome
,email
, etc.) que todas as subclasses dePessoa
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 comoprotected
, 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 tipoLong
para representar a identidade da pessoa.nome
: O nome da pessoa, do tipoString
.email
: O email da pessoa, do tipoString
.senha
: A senha da pessoa, armazenada comoString
.cpf
: O Cadastro de Pessoa Física (CPF) da pessoa, do tipoString
, que serve como um identificador único no Brasil.dataCriacao
: A data de criação do registro da pessoa, definida como umLocalDate
. Ao inicializar, recebe a data atual por meio do métodoLocalDate.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 atributonome
.
- Por exemplo,
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 atributonome
para o valor passado como parâmetro.
- Por exemplo,
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 dePessoa
:
public class Tecnico extends Pessoa {
// Atributos e métodos específicos de Técnico.
}
- Neste exemplo,
Tecnico
herdaria automaticamente os atributos e métodos dePessoa
, comonome
,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.