Acessar ArrayList de um método através de outro método

Olá, pessoal. Sou novo aqui no GUJ e em Java.

Eu não estou sabendo como fazer para acessar, por um método, um valor contido em outro método(um ArreyList, mais especificamente). Todos os métodos estão dentro da Classe principal, porém, eles estão antes do main. Tem como fazer isso?
identar texto pre-formatado em 4 espaços
public class Trabalho {

Trabalho trabalho = new Trabalho();

public static void cadastrarFuncionario() {
    System.out.println("\n\tDados do Funcionário:");
    Funcionario funcionario = new Funcionario();
    Scanner dadosFuncionario = new Scanner(System.in);
    ArrayList<Funcionario> funcionarios = new ArrayList<>();

    System.out.print("Nome Completo: ");
    String nome = dadosFuncionario.nextLine();
    funcionario.setNome(nome);

    System.out.print("Informar Salário Base: ");
    double salarioBase = dadosFuncionario.nextDouble();
    funcionario.setSalarioBase(salarioBase);

    System.out.print("Informar Ano de Início: ");
    int anoInicio = dadosFuncionario.nextInt();
    funcionario.setAnoInicio(anoInicio);

    funcionarios.add(funcionario);
    System.out.println(Arrays.toString(funcionarios.toArray()));
}

public static void mostrarCadastros() {

// Aqui eu gostaria de acessar o ArrayList do método cadastrarFuncionario.

    System.out.println();
}

public static void main(String[] args) {
//Trabalho trabalho = new Trabalho();

    opcoes();

// Fim
identar texto pre-formatado em 4 espaços

Para conseguir acessar a ArrayList no método " mostrarCadastros" é preciso colocar esse ArrayList como atributo da sua classe Trabalho e deixa todos os métodos declarados dessa classe como métodos de instância (remova o static).

public class Trabalho {
     List<Funcionario> functionarios;
    
     public Trabalho() {
        this.funcionarios = new ArrayList<Funcionario>();
     }
    
     public void cadastrarFuncionario() {
            // acessa sua lista através do this.funcionarios...
     }

     public void mostrarCadastros() {
            // acessa sua lista através do this.funcionarios...
     }

}

mas de um modo geral recomendo você não usar métodos que utilizem o System.out.println, seria melhor você ter um método que retorna os cadastros, como:

public List<Funcionario> getFuncionarios() {
     return this.funcionarios;
}

assim fica a cargo de quem chamar manipular do modo que desejar.

2 curtidas

Eu tenho que retirar o Static?
Quando eu retiro, eu não consigo chamar nenhum método. Eu tentei acessar pelo this.funcionarios mas não consegui. Bom… o que vale é a tentativa.

public class Trabalho {
    List<Funcionario> funcionarios;
    
    public Trabalho(){
        this.funcionarios = new ArrayList<>();
    }

    public static byte opcao;

    public void opcoes() {
        System.out.println("Escolha a opção desejada.");
        System.out.println("1 - Cadastrar Funcionário");
        System.out.println("2 - Cadastrar Gerente");
        System.out.println("3 - Remover Funcionário ou Gerente");
        System.out.println("4 - Mostrar Funcionários");
        System.out.println("5 - Calcular folha de pagamento");
        System.out.println("0 - Sair");
        Scanner input = new Scanner(System.in);
        System.out.print("Opção: ");
        opcao = input.nextByte();
    }

    public void cadastrarFuncionario() {
        System.out.println("\n\tDados do Funcionário:");
        Funcionario funcionario = new Funcionario();
        Scanner dadosFuncionario = new Scanner(System.in);
        ArrayList<Funcionario> funcionarios = new ArrayList<>();

        System.out.print("Nome Completo: ");
        String nome = dadosFuncionario.nextLine();
        funcionario.setNome(nome);

        funcionarios.add(funcionario);
        System.out.println(Arrays.toString(funcionarios.toArray()));
    }

        public void mostrarCadastros() {
        System.out.println();
    }

    public static void main(String[] args) {
        
        opcoes(); // aqui dá erro

        switch (opcao) {
            case 0:
                System.out.println("Obrigado por utilizar o nosso sistema.");
                break;
            case 1:
                cadastrarFuncionario();
                System.out.println();
                Trabalho.main(args);
                break;

Eu sinceramente sempre achei difícil de aprender quando o trabalho de declaração de métodos e atributos ficam na classe de execução… porque você não separa em duas camadas e faz como o amigo acima disse? é mais didático… tipo assim:

Classe: Trabalho

public class Trabalho {
     List<Funcionario> functionarios;
    
     public Trabalho() {
        this.funcionarios = new ArrayList<Funcionario>();
     }
    
     public void cadastrarFuncionario() {
            // acessa sua lista através do this.funcionarios...
     }

     public void mostrarCadastros() {
            // acessa sua lista através do this.funcionarios...
     }

}

Classe: Trabalhar

public static void main(String[] args) {
   Trabalho trabalho = new Trabalho();
   trabalho.cadastrarFuncionarios();
   trabalho.mostrarCadastros();
}
1 curtida

Se você quiser ainda fazer na força bruta, os atributos e os métodos que serão executados dentro do:

public static void main(String[] args) {

deverão ser todos static tipo:

public static void opcoes() {
public static void cadastrarFuncionario() {

e o uso é assim:

Trabalho.opcoes();

Sabe porque eu disse força bruta? porque métodos e atributos static são guardados na classe durante toda a execução do programa como se fossem variáveis “globais”, e não somem quando o objeto é descartado… Pode ser que agora eu esteja falando um monte de bobagens que não representam seu objetivo atual, e ter ou não métodos e atributos globais não faça a minima diferença, mas em projetos reais isso faz um diferença enorme principalmente se vc partir pra WEB…

1 curtida