Problemas com Vector

Olá,
Estou fazendo um trabalho do meu curso, e não estou conseguindo alterar dados de um objeto dentro de um Vector. Eu possuo um objeto chamado Obra, que armazena dados de um livro, dentro desse objeto existe um boolean chamado “disponibilidade” para dizer se a obra está disponível ou não para locação.
O que eu preciso é mudar essa “disponibilidade” para false para identificar que a obra já está locada e não realizar uma nova locação.

Classe Obra:

package biblioteca;
import javax.swing.JOptionPane;
public class Obra {
    private String titulo;
    private int codigo;
    private Autor autor;
    private Editora editora;
    private int qtdadepag;
    private int ano;
    private int edicao;
    private boolean disponivel;//indica se o livro está disponível

    public Obra(int codigo, Autor autor, Editora editora){
        titulo = JOptionPane.showInputDialog("Título ");
        this.codigo = codigo;
        this.autor = autor;
        this.editora = editora;
        qtdadepag = Integer.parseInt(JOptionPane.showInputDialog("Quantidade de Páginas: "));
        ano = Integer.parseInt(JOptionPane.showInputDialog("Ano: "));
        edicao = Integer.parseInt(JOptionPane.showInputDialog("Edição: "));
        disponivel = true;
        //atribui valores às variáveis
    }
    
    public void setDisponivel(boolean disponivel){
        this.disponivel = disponivel;//atribui true ou false para dizer se a obra está disponível
    }
    
    public String getTitulo(){
        return titulo;//retorna o título
    }
    
    public int getCodigo(){
        return codigo;//retorna o código do livro
    }
    
    public boolean getDisponivel(){
        return disponivel;//retorna a disponibilidade do livro
    }

}

Classe Principal:

package biblioteca;
import java.util.Vector;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class Main {
    static Scanner s = new Scanner(System.in);
    static Vector aluno = new Vector();
    static Vector professor = new Vector();
    static Vector autor = new Vector();
    static Vector editora = new Vector();
    static Vector obra = new Vector();

    public static void main(String[] args) {
        menu();//chama o menu
    }
    
    public static void menu(){
        int opcao;
        do {
            String menu = "Escolha a opção desejada:"
                        + "\n1 - Cadastrar Aluno"
                        + "\n2 - Cadastrar Professor"
                        + "\n3 - Cadastrar Autor"
                        + "\n4 - Cadastrar Editora"
                        + "\n5 - Cadastrar Obra"
                        + "\n6 - Empréstimo para Aluno"
                        + "\n7 - Finalizar Programa";
            opcao = Integer.parseInt(JOptionPane.showInputDialog(menu));
            switch (opcao){
                case 1:
                    cadastroAluno();
                    break;
                case 2:
                    cadastroProfessor();
                    break;
                case 3:
                    cadastroAutor();
                    break;
                case 4:
                    cadastroEditora();
                    break;
                case 5:
                    cadastroObra();
                    break;
                case 6:
                    emprestimoAluno();
                    break;
                case 7:
                    break;
                default:
                    JOptionPane.showMessageDialog(null, "Opção Inválida!");
            }
        } while(opcao!=7);//faz repetir os comandos acima até que seja colocado o número para sair do programa
    }
    
    public static void cadastroAluno(){
        Aluno novoaluno = new Aluno ();
         aluno.add(aluno.size(), novoaluno);
    }
    
    public static void cadastroProfessor(){
        Professor novoprofessor = new Professor ();
         professor.add(professor.size(), novoprofessor);
    }
    
    public static void cadastroAutor(){
        Autor novoautor = new Autor();
        autor.add(autor.size(), novoautor);
    }
    
    public static void cadastroEditora(){
        Editora novaeditora = new Editora();
        editora.add(editora.size(), novaeditora);
    }
    
    public static void cadastroObra(){
        if (autor.size() == 0){
            JOptionPane.showMessageDialog(null, "Nenhum Autor Cadastrado!");
        } else{
            Autor auxautor;
            String idautores = "Selecione o Autor Desejado:\n";
            for (int x=0; x<autor.size(); x++){
                auxautor = (Autor) autor.elementAt(x);
                idautores = idautores+"ID: "+(x+1)+" Autor: "+auxautor.getNomeAutor()+"\n";
            }
            int idautor = Integer.parseInt(JOptionPane.showInputDialog(idautores));
            auxautor = (Autor) autor.elementAt(idautor-1);
            if (editora.size() == 0){
                JOptionPane.showMessageDialog(null, "Nenhuma Editora Cadastrada!");
            } else{
                Editora auxeditora;
                String ideditoras = "Selecione a Editora Desejada:\n";
                for (int x=0; x<editora.size(); x++){
                    auxeditora = (Editora) editora.elementAt(x);
                    ideditoras = ideditoras+"ID: "+(x+1)+" Editora: "+auxeditora.getNomeEditora()+"\n";
                }
                int ideditora = Integer.parseInt(JOptionPane.showInputDialog(ideditoras));
                auxeditora = (Editora) editora.elementAt(ideditora-1);
                Obra novaobra = new Obra(obra.size()+1, auxautor, auxeditora);
                obra.add(obra.size(), novaobra);
            }
        }
    }
    
    public static void emprestimoAluno(){
        if (aluno.size() == 0){
            JOptionPane.showMessageDialog(null, "Nenhum Aluno Cadastrado!");
        } else{
            Aluno auxaluno;
            String idalunos = "Selecione o Aluno Desejado:\n";
            for (int x=0; x<aluno.size(); x++){
                auxaluno = (Aluno) aluno.elementAt(x);
                idalunos = idalunos+"ID: "+(x+1)+" Aluno: "+auxaluno.getNomeAluno()+"\n";
            }
            int idaluno = Integer.parseInt(JOptionPane.showInputDialog(idalunos));
            auxaluno = (Aluno) aluno.elementAt(idaluno-1);
            if (obra.size() == 0){
                JOptionPane.showMessageDialog(null, "Nenhuma Obra Cadastrada!");
            } else{
                Obra auxobra;
                String idobras = "Selecione a Obra Desejada:\n";
                for (int x=0; x<obra.size(); x++){
                    auxobra = (Obra) aluno.elementAt(x);
                    idobras = idobras+"ID : "+(x+1)+" Título: "+auxobra.getTitulo()+"\n";
                }
                int idobra = Integer.parseInt(JOptionPane.showInputDialog(idobras));
                auxobra = (Obra) obra.elementAt(idobra-1);
                int cod = auxobra.getCodigo();
                int posicaoemprestimo = 0;
                boolean achado = false;
                for (int x=0; x<3; x++){
                    if (auxaluno.getEmprestimoAluno(x) == 0){
                        achado = true;
                        posicaoemprestimo = x;
                    }
                }
                if (achado == false){
                    JOptionPane.showMessageDialog(null, "O Aluno está com o limite de empréstimos!");
                } else{
                    if (auxobra.getDisponivel() == false){
                        JOptionPane.showMessageDialog(null, "O Livro já está emprestado!");
                    } else{
                        auxaluno.setEmprestimoAluno(cod, posicaoemprestimo);
                        auxobra.setDisponivel(false);
                        //aqui eu precisaria atualizar uma determinada posição do Vector Obra
                        //para mudar o boolean "Disponivel" de true para false,
                        //pensei em algo como:
                        //obra.elementAt(idobra-1) = auxobra;
                        //mas não funciona
                        JOptionPane.showMessageDialog(null, "Empréstimo feito com sucesso!");
                    }
                }
            }
        }
    }

}

Como eu poderia fazer isso?
Quem puder me ajudar eu agradeço! :smiley:

Ôpa, parece que consegui…

Parece que quando eu fiz uma cópia do objeto da posição que eu queria com o comando:

auxobra = (Obra) obra.elementAt(idobra-1);

Quando eu altero a cópia dela:

auxobra.setDisponivel(false);

a Obra dentro do Vector sofre as alterações tbm…
Não sei se foi uma espécie de passagem de valor por referência…
Será que alguem pode me explicar?
Ou se conhecerem alguma maneira melhor de fazer isso…

Agradeço pela atenção.

Em primeiro lugar… bem-vindo ao GUJ!

Não use Vector, use List (e ArrayList). Esse tópico explica como e porque:
http://www.guj.com.br/posts/list/74068.java#389435

Também seria uma boa você especificar o tipo da sua lista com os generics. No link ali em cima tem um exemplo de como fazer isso. Isso não só torna a aplicação mais segura como mais fácil, já que você vai evitar casts.

Finalmente, você não fez uma cópia ao fazer:

auxobra = (Obra) obra.elementAt(idobra-1);  

Todos as variáveis de objetos em java são baseados em referências, que nada mais são do que um “ponteiro bem comportado” para o objeto. Quando vc faz esse igual, vc faz uma cópia por valor dessa referência, e não do objeto em si.

Isso é a cara dos exercícios do Tite, por acaso você é aluno dele?

Bom, só repetindo o que já foi falado, afinal não custa :slight_smile:

Sempre que você cria uma nova variavel e aponta ela para um objeto já existente, você não está copiando o objeto, e sim apontando para ele com essa nova referencia. Assim, se caso uma das referencias alterarem algo no objeto, a outra referencia vai ter a mesma alteração (afinal, era o mesmo objeto!).

Agora um conselho: tente criar mais métodos. O método cadastro obra tem quase 100 linhas! Você pode dividir esse método em vários métodos menores. Isso facilitaria muito a manutenção do seu código.

O professor que tenho aula é o Rodrigo Borges, não sei se ele tem algum apelido…
Ele dá aula aqui no Senai de São José

Quanto a ajuda dos meus amigos do GUJ:
Obrigado pela ajuda, vocês são muito claros em suas explicações,
daí fica facil de entender.
Valeu mesmo!
:smiley: